在同一行初始化两个变量

mrj*_*bba 24 ruby

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

而不是这个:

foo = 0
bar = 0
Run Code Online (Sandbox Code Playgroud)

你可以这样做?

foo = bar = 0
Run Code Online (Sandbox Code Playgroud)

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

Pre*_*ids 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"
Run Code Online (Sandbox Code Playgroud)


Dou*_*rer 30

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

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

foo, bar = 1, 2
foo #=> 1
bar #=> 2
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!我更喜欢 : foo, bar = 1, 2 我没想到那个。它仍然可读。 (2认同)

Ign*_*ams 18

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

foo, bar = 0, 0
Run Code Online (Sandbox Code Playgroud)


ooz*_*zal 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

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