Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 使用循环计数器作为变量的一部分';红宝石的名字_Ruby - Fatal编程技术网

Ruby 使用循环计数器作为变量的一部分';红宝石的名字

Ruby 使用循环计数器作为变量的一部分';红宝石的名字,ruby,Ruby,我正在尝试生成一组将要操作的变量。从2个变量开始,4,8,16,现在是我将变量生成放入循环的时候了 该变量用作数组索引的存储 所以一个线程醒来,拿起一个变量,说“variable_0”是第一个索引,并在其中存储位置24 这通常是这样做的。此变量将继续,并在以后多次使用 变量_0=获取索引(threadid) 一旦我有了16个这样的变量,看到这句话重复了不止一次,真是痛苦和丑陋。所以我想我应该加入一个循环,用两种方法来尝试 1。评估 for i in 0..15 do eval("var

我正在尝试生成一组将要操作的变量。从2个变量开始,4,8,16,现在是我将变量生成放入循环的时候了

该变量用作数组索引的存储

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

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

变量_0=获取索引(threadid)

一旦我有了16个这样的变量,看到这句话重复了不止一次,真是痛苦和丑陋。所以我想我应该加入一个循环,用两种方法来尝试

1。评估

for i in 0..15 do 
    eval("variable_#{i} = get_index(threadid)")
end
根本不起作用

2。实例变量集合

for i in 0..15 do
    index_name = "variable_#{i}"
    index_val = get_index(threadid)
    instance_variable_set("#{index_name}", :index_val)
end
这也不起作用,因为后面的语句几乎打印“变量未找到”

有没有一个好的方法来做这件事


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

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

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

puts @variable_4 # "some value"

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

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

puts @variable_4 # "some value"

正如其他人指出的,在Ruby中动态创建局部变量是不可能的,如果您正在寻找另一种方法来实现这一点,您也可以设置绑定

通过评估

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, :_]
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, :_]
评估

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, :_]
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, :_]

正如其他人指出的,在Ruby中动态创建局部变量是不可能的,如果您正在寻找另一种方法来实现这一点,那么也可以设置绑定

通过评估

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, :_]
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, :_]
评估

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, :_]
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, :_]


这是一个常见的XY问题,反复询问。您应该使用数组来保存所有值。变量由外部软件使用,它不接受数组元素。我的意思是我在上面也写了这篇文章,这是一个我无法克服的限制,这并不是我自己不愿意使用数组……但是您似乎可以自由地使用变量命名(局部或实例)。这是一种奇怪的情况,您仍然没有使用数组的自由。你的情况不清楚。我能问一下,为什么你想要一组包含计数器的变量,而不仅仅是一个数组?为什么@variable_0比@variables[0]好?@JohnNikolaou这没什么意义。您传递的是分配给变量的对象,而不是变量本身。因此,如果将对象指定给数组的变量或元素,则不相关。这是一个常见的XY问题。您应该使用数组来保存所有值。变量由外部软件使用,它不接受数组元素。我的意思是我在上面也写了这篇文章,这是一个我无法克服的限制,这并不是我自己不愿意使用数组……但是您似乎可以自由地使用变量命名(局部或实例)。这是一种奇怪的情况,您仍然没有使用数组的自由。你的情况不清楚。我能问一下,为什么你想要一组包含计数器的变量,而不仅仅是一个数组?为什么@variable_0比@variables[0]好?@JohnNikolaou这没什么意义。您传递的是分配给变量的对象,而不是变量本身。因此,如果将对象分配给数组中的变量或元素,则与此无关。这是一种糟糕的模式,您应该回答一些有助于OP更好地编写代码的问题,例如创建值数组并对其进行操作。这是真的。但该海报表示,
Array
不能使用。我该判断谁?在
中你不需要冒号:“@variable_35;{I}”
。该方法接受字符串和符号。谢谢@sawa,更正。@jturlla是的,这是一个糟糕的模式,但他问了一个问题,这是正确的答案。Ofc,更好的方法是使用
散列
数组
。这是一种糟糕的模式,您应该回答一些有助于OP更好地编写代码的问题,比如创建一个值数组并对其进行操作。这是真的。但该海报表示,
Array
不能使用。我该判断谁?在
中你不需要冒号:“@variable_35;{I}”
。该方法接受字符串和符号。谢谢@sawa,更正。@jturlla是的,这是一个糟糕的模式,但他问了一个问题,这是正确的答案。对于Ofc,更好的方法是使用
散列
数组
。正确答案,但不是“好”答案。我不喜欢这样使用
eval
。但是+1贪婪评估似乎总是邪恶的,然而这是ruby docs()所描述的方式,我也在没有评估的情况下更新了它,似乎这毕竟是可能的!答案正确,但不是“好”答案。我不喜欢这样使用
eval
。但是+1贪婪评估似乎总是邪恶的,然而这是ruby docs()所描述的方式,我也在没有评估的情况下更新了它,似乎这毕竟是可能的!