在Ruby

时间:2016-02-24 16:16:05

标签: ruby

我正在尝试生成一组将要操作的变量。从2个变量开始,4,8,16及其时间我把变量生成放在一个循环中。

该变量充当数组索引的存储空间。

所以一个线程醒来,拿起一个变量并说“variable_0”是第一个索引,并将位置24存储在其中。

通常这样做。此变量继续,并在以后多次使用。

variable_0 = get_index(threadid)

一旦我有16个这样的变量,看到这条线重复不止一次是一种痛苦和丑陋。所以我认为我已经进行了循环并尝试了2种方法。

1。 EVAL

for i in 0..15 do 
    eval("variable_#{i} = get_index(threadid)")
end

根本不起作用。

2。 instance_variable_set

for i in 0..15 do
    index_name = "variable_#{i}"
    index_val = get_index(threadid)
    instance_variable_set("#{index_name}", :index_val)
end

这也不起作用,因为后面的语句打印“找不到变量”。

有没有好办法做到这一点?

由于后来的限制,我不能使用数组,每个变量必须构造为一个变量,所以没有数组或类似的东西可以工作

2 个答案:

答案 0 :(得分:3)

正如其他人指出的那样,无法在Ruby中动态创建局部变量,如果您正在寻找另一种实现此目的的方法,也可以设置绑定。

使用 eval

b = binding
10.times do |i|
  eval("var#{i} = 'foo'", b)
end

> eval("var1", b)
=> "foo"

> eval("local_variables", b)
=> [:var9, :var8, :var7, :var6, :var5, :var4, :var3, :var2, :var1, :var0, :b, :_]

没有 eval

b = binding
10.times do |i|
  b.local_variable_set("var#{i}", 'foo')
end

> b.local_variable_get('var1')
=> "foo"

> b.local_variables
=> [:var9, :var8, :var7, :var6, :var5, :var4, :var3, :var2, :var1, :var0, :b, :_]

答案 1 :(得分:2)

你的第二个例子几乎是有效的。您忘记了@实例变量名称,并且您将符号作为值传递而不是值本身。

for i in 0..15 do
  index_val = "some value #{i}"
  instance_variable_set("@variable_#{i}", index_val)
end

puts @variable_4 # "some value"

https://repl.it/BnLO/6