你能在ruby中的一行上动态初始化多个变量吗?
(我只编写了几个星期,这是我的第一个问题,所以请耐心等待!)
在ruby中,我知道你可以在一行上初始化多个变量,如下所示:
a, b = 1, 2
但是,我想知道是否可以在一个也生成其名称的循环中初始化多个变量。 这是一些解释我的意思的伪代码:
For X between 0 and 3, even_X = X * 2
这将设置even_0 == 0
, even_1 == 2
, even_2 == 4
, even_3 == 6
。
我意识到可以通过迭代创建一个数组然后调用它的成员来实现相同的function,但我仍然很好奇是否有办法做到这一点。
谢谢!
有一种方法,使用eval
,但你宁愿不想使用它(我甚至会走得那么远,说最好不要在以后学习它)。
根本不存在使用它而不是普通数组的情况。
对于您的示例,应该使用类Range
和方法map
:
(0..3).map{|i| i * 2} #=> [0, 2, 4, 6]
你可以看到这已经完成而没有声明任何变量 – 即使i
只是在传递给map
的块中存活。 之后它不存在。
如果您使用的是Ruby 1.8,那么您将能够使用eval
来完成您所追求的目标。 但是,如果你使用1.9它将无法工作,因为在eval
创建的局部变量不能在eval
之外访问 。
因此,要回答您的问题,不能像您在伪代码中指定的那样动态创建局部变量。 但是,如果我们可以创建实例变量,我们可以做你想要的事情。 所以你可以做一些事情:
4.times do |i| self.instance_variable_set("@even_#{i}".to_sym, i*2) end
这将做你想要的,但你会得到一堆实例变量而不是局部变量。
您还可以使用instance_eval
和attr_accessor
或define_method
动态定义accessor和mutator方法,但最终结果将是相同的 – 您将动态创建一堆实例变量。
我完全赞同Mladen。 从概念的角度来看,你几乎总是更好地使用方法(此外:对于阅读代码的其他人来说,动态定义局部变量非常难以理解):
def even(x) x * 2 end # from here on the power of the computing universe is at your hands: even(5050) #=> 10100