在同一行初始化两个变量

时间:2011-05-14 15:34:09

标签: ruby

我无法找到权威的例子或讨论这个概念。如果我的Ruby方法中有2个变量是数字,我需要将它们初始化为零。它们将用作计数器。这样可以还是安全的?它适用于我的测试。

而不是:

foo = 0
bar = 0

你可以这样做吗?

foo = bar = 0

这似乎是保存线条并且仍然富有表现力的好方法。或者,这是一种不好的做法吗?我意识到我会牺牲一点可读性。但是,在一个小的Ruby方法(< 10行)中,这可能不是一个有效的问题。

5 个答案:

答案 0 :(得分:35)

这很有效,但是你应该知道它对你的情况是安全的,因为你在数字中使用变量,这些变量在Ruby中是不可变的。例如,如果您使用字符串尝试相同的操作,最终可能会遇到一些您不期望的行为:

ruby-1.9.2-p180 :001 > foo = bar = "string"
 => "string" 
ruby-1.9.2-p180 :002 > foo.upcase!
 => "STRING" 
ruby-1.9.2-p180 :003 > bar
 => "STRING"

答案 1 :(得分:30)

最好在同一行上初始化两个变量,只要该值被指定为短且易于遵循。您甚至可以使用数组语法分配两个不同的值。

foo = bar = 123
foo #=> 123
bar #=> 123

foo, bar = 1, 2
foo #=> 1
bar #=> 2

答案 2 :(得分:17)

在许多语言中,后者为两个变量分配相同的对象,如果对象是可变的,则可能会遇到麻烦。最好这样做:

foo, bar = 0, 0

答案 3 :(得分:8)

这很奇怪。

Ignacio Vazquez-Abrams对于使用不同的值初始化变量的回答是正确的:
a, b = 123, 456

但是,我认为你关心的是做以下事项:
a = b = "hello"

但等待!上面的行为变量ab分配相同的内存地址,即
a.object_idb.object_id相等。因此a上的所有更改都会在b上保留。

我不喜欢它,但可以解决方法 x = "a very long string or something you don't want to type multiple times"
a, b, c = x.clone, x.clone, x.clone

哦,我希望有一种优雅的方式来做到这一点。

答案 4 :(得分:1)

这是安全的并且有效。

完全取决于您的编码标准,无论这样的事情是否令人不满。

使用它,并在时机成熟时留待以后重构。