你能在ruby中的一行上动态初始化多个变量吗?

时间:2011-08-06 16:16:18

标签: ruby

(我只编了几个星期,这是我的第一个问题,所以请耐心等待我!)

在ruby中,我知道你可以在一行上初始化多个变量,如下所示:

a, b = 1, 2

但是,我想知道是否可以在一个也生成其名称的循环中初始化多个变量。这是一些解释我的意思的伪代码:

For X between 0 and 3, even_X = X * 2

这会设置even_0 == 0even_1 == 2even_2 == 4even_3 == 6

我意识到可以通过迭代创建一个数组然后调用它的成员来实现相同的功能,但是我仍然很好奇是否有办法做到这一点。

谢谢!

3 个答案:

答案 0 :(得分:6)

有一种方法,使用eval,但你宁愿不想使用它(我甚至可以说,最好不要学习它直到以后)。

根本不存在使用它而不是普通数组的情况。

对于您的示例,应使用类Range和方法map

(0..3).map{|i| i * 2}
#=> [0, 2, 4, 6]

你可以看到这已经完成而没有声明任何变量 - 即使i在传递给map的块内仍然存在。之后它不存在。

答案 1 :(得分:3)

如果您使用的是Ruby 1.8,那么您可以使用eval来完成您所追求的目标。但是,如果您使用的是1.9,则无效,因为在eval can not be accessed outside of the eval中创建了1.9个局部变量。

因此,要回答您的问题,不能动态创建您在伪代码中指定的本地变量。但是,如果我们可以创建实例变量,我们可以做你想要的事情。所以你可以按照以下方式做点什么:

4.times do |i|
  self.instance_variable_set("@even_#{i}".to_sym, i*2)
end

这会做你想要的,但你会得到一堆实例变量而不是局部变量。

您还可以使用instance_evalattr_accessordefine_method动态定义访问器和增变器方法,但最终结果将是相同的 - 您将动态创建一堆实例变量

答案 2 :(得分:1)

我完全赞同Mladen。从概念的角度来看,你几乎总是更好地使用方法(此外:对于阅读代码的其他人来说,动态定义局部变量很难理解):

def even(x)
   x * 2
end

# from here on the power of the computing universe is at your hands:
even(5050)
#=> 10100