在同一行上初始化两个变量
我很难找到一个权威的例子或讨论这个概念。 如果我的Ruby方法中有2个变量是数字,我需要将它们初始化为零。 它们将用作计数器。 这样可以还是安全的? 它适用于我的测试。
而不是这个:
foo = 0 bar = 0
你可以这样做?
foo = bar = 0
这似乎是一种保存线条并且仍然具有表现力的好方法。 或者,这是一种不好的做法吗? 我意识到我会牺牲一点可读性。 但是,在一个小的Ruby方法(<10行)中,这可能不是一个有效的问题。
这是有效的,但你应该知道它对你的情况是唯一安全的,因为你在数字中使用变量,这些变量在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"
只要将值指定为短且易于遵循,就可以在同一行上初始化两个变量。 您甚至可以使用数组语法分配两个不同的值。
foo = bar = 123 foo #=> 123 bar #=> 123 foo, bar = 1, 2 foo #=> 1 bar #=> 2
在许多语言中,后者为两个变量分配相同的对象,如果对象是可变的,则可能会遇到麻烦。 最好这样做:
foo, bar = 0, 0
这很奇怪。
Ignacio Vazquez-Abrams的答案适用于初始化具有不同值的变量:
a, b = 123, 456
但是,我认为你关心的是做以下事情:
a = b = "hello"
可是等等! 上面的行为变量a
和b
分配相同的内存地址
a.object_id
和b.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
哦,我希望有一种优雅的方式来做到这一点。
这是安全的,它的工作原理。
完全取决于您的编码标准,无论这样的事情是否令人不满。
使用它,并在时机成熟时留待以后重构。