2012-04-17 64 views
2

如果我有变量如下,红宝石,使用插在变量名

i = 1 
k1 = 20 

有没有方法让K1的值与我的插值?

喜欢的东西,

k"#{i}" 
=> 20 

在此先感谢。

+3

这可能与“eval”但不这样做。这是一个糟糕的编程,海事组织。 – yazu 2012-04-17 01:18:26

+0

为什么会这样?我是编程新手。请赐教。 – 2012-04-18 02:10:41

+1

我的英语不是很好,但我会尝试。 1)评估是不安全的。 2)你真的想要使用一个数组。 3)符号引用(它是一个真正的符号引用 - 保留另一个变量名称的变量)很难读取,维护和调试。 4)这违反了很多编程原则 - 命名空间,封装等。 – yazu 2012-04-18 04:28:00

回答

3

这取决于它是local variable还是methodsend "k#{i}"应与方法做的伎俩:

class Foo 
    attr_accessor :i, :k1 

    def get 
    send "k#{i}" 
    end 
end 

foo = Foo.new 
foo.i = 1 
foo.k1 = "one" 
foo.get 
# => "one" 

如果你真的需要,你可以使用当前Bindinglocal_variable_get访问本地变量:

i = 1 
k1 = "one" 
local_variables 
# => [:i, :k1] 
binding.local_variable_get("k#{i}") 
# => "one" 

这是很可怕,但。在这种情况下,您最好使用Hash

i = 1 
k = {1 => "one"} 
k[i] 
# => "one" 
+0

eval对我很好。我会记住你使用哈希的建议。 – 2012-04-17 01:34:33

+0

但是,如果你有数据库列,如... – 2012-04-17 01:34:57

+0

column1 column2 column3 ...,你想要在循环内调用它们,你会怎么做? – 2012-04-17 01:35:26