2011-05-14 66 views
20

我無法找到此概念的權威示例或討論。如果我的Ruby方法中有兩個變量是數字,我需要將它們初始化爲零。他們將被用作計數器。這是好還是安全?它在我的測試中起作用。在同一行上初始化兩個變量

取而代之的是:

foo = 0 
bar = 0 

你可以做到這一點?

foo = bar = 0 

這似乎是一個很好的方式,以節省線路,仍然有表現。或者,這是不好的做法?我意識到我會犧牲一點可讀性。但是,在一個小的Ruby方法(< 10行)中,這可能不是一個有效的關注點。

回答

15

在很多語言中,後者將兩個變量分配給同一個對象,如果該對象是可變的,則會造成麻煩。最好做到這一點:

foo, bar = 0, 0 
+0

在某些語言中是正確的,但在Ruby中與所提問題無關。 IMO完全沒問題。 – Phrogz 2011-05-14 15:58:04

+0

@Progrog,這在Ruby中工作正常。 – jasonleonhard 2015-11-26 22:27:45

+1

它工作正常,但不推薦,可讀性較差。 https://github.com/bbatsov/ruby-style-guide#parallel-assignment – 2017-01-08 19:00:32

1

它是安全的,它的工作原理。

完全取決於您的編碼標準,不管這樣的事情是否被壓抑。

使用它,等待時間到了以後重構。

25

在同一行上初始化兩個變量是很好的做法,只要該值被分配爲簡短且易於遵循。您甚至可以使用數組語法分配兩個不同的值。

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

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

謝謝!我很喜歡:foo,bar = 1,2我沒有想到那個。它仍然可讀。 – mrjabba 2011-05-14 15:53:14

30

這工作,但你應該知道,這是因爲您使用的是數字變量,這是在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" 
7

這很奇怪。

伊格納西奧巴斯克斯 - 艾布拉姆斯的答案是與不同的價值觀與初始化變量真:
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

哦,我希望能有這樣的一種優雅的方式。

+0

對我來說這看起來很優雅... – 2016-12-13 21:32:05