【问题标题】:How to dynamically alter variable names? [duplicate]如何动态更改变量名? [复制]
【发布时间】:2017-11-29 23:59:56
【问题描述】:

我有以下循环:

(1..1000).each do |i|
  user1 = User.create(:name => "Bob#{i}")
  ...
end

如何让变量名user1 使用i 动态变化来获取:

user1 == Bob1
user2 == Bob2
user3 == Bob3

【问题讨论】:

  • 为什么不使用数组来存储这些用户呢? users = (1..1000).map{|i| User.create(...)}
  • 我需要在循环中做更多的事情
  • 在块内声明的局部变量不能从块外访问。因此,您可以将变量命名为 user
  • 如果你的本地变量在块内不会离开块,那会是什么意思。他们的范围是有限的。
  • @AnnaSm “我需要在循环中做更多事情”——你需要对循环当前迭代的用户做更多事情还是同时对多个用户做更多事情?

标签: ruby local-variables


【解决方案1】:

你不能,但你可以使用Hash 来获得类似的结果:

(1..1000).each_with_object({}) do |i, users|
  users["user#{i}"] = User.create(:name => "Bob#{i}")
end

如果需要访问块外的哈希,只需将其分配给一个变量即可:

users = (1..1000).each_with_object({}) { |i, users| users["user#{i}"] = User.create(:name => "Bob#{i}") }

并像这样访问特定用户(例如user1):

users["user1"]

或者您可以只使用i 作为键:

users = (1..1000).each_with_object({}) { |i, users| users[i] = User.create(:name => "Bob#{i}") }

并像这样访问特定用户(例如user1):

users[1]

【讨论】:

  • “在 Ruby 2.0 之前”?你的意思是“自从 Ruby 2.1”?
  • "在 Ruby 2.0 之前,您实际上可以使用 evalbinding.local_variable_set 方法动态创建本地变量。" ——这是错误的。 a) 您不能使用Binding#local_variable_set 创建局部变量。您只能设置现有的。 b) Binding#local_variable_set 是在 Ruby 2.1 中添加的,它在 Ruby 2.0 之前不可用。 c) eval did 过去泄漏了范围,但那是在 Ruby 1.8 及更早版本中,技术上是“在 Ruby 2.0 之前”,但该声明还包括Ruby 1.9,它不是真的。
  • @JörgWMittag 感谢您的澄清,我已经更新了答案(删除了该声明)以避免混淆。
猜你喜欢
  • 2016-08-31
  • 2012-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-10
  • 2020-06-15
相关资源
最近更新 更多