我正在尝试生成一组将要操作的变量。从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
这也不起作用,因为后面的语句打印“找不到变量”。
有没有好办法做到这一点?
由于后来的限制,我不能使用数组,每个变量必须构造为一个变量,所以没有数组或类似的东西可以工作
答案 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"