2011-06-19 63 views
2

如何用一行代碼創建三個空的哈希值?如何用一行代碼創建三個對象?

我知道a = b = c = Hash.new將無法​​正常工作,因爲這將創建三個引用到相同的哈希對象。

a,b,c = Hash.new將分配給Hasha,但bc保持nil

我知道我可以做a, b, c = Hash.new, Hash.new, Hash.new,但看起來不太乾。

+2

這三個哈希得來的* *某處。 – delnan

+0

@delnan因此,創建一個類的多個實例沒有捷徑嗎? :( – omninonsense

+5

由於'Hash.new'調用既不使用參數也不使用塊,因此可以將其縮短爲'a,b,c = {},{},{}'。 –

回答

5

正如我張貼的評論,我覺得a, b, c = {}, {}, {}是最好的方式,因爲它是短,易於閱讀。如果你真的想這樣做更復雜的方式,像這樣將工作:

>> a, b, c = Array.new(3) { Hash.new } #=> [{}, {}, {}] 
>> a #=> {} 
>> b #=> {} 
>> C#=> {} 
+0

好吧,我一直在尋找一個語言結構,但因爲有沒有,我猜想你的答案最多的,我會接受它。所有其他answeres比較好,太(雖然我自己嘗試過使用'3.times.map {Hash.new}',但我並不太滿意)。謝謝大家:D – omninonsense

3

我真的不知道我是否會使用,但它是可能的:

a, b, c = 3.times.map { Hash.new } 
# or 
a, b, c = (1..3).map { Hash.new } 
1

雖然你已經打上一個答案,我會以另一種方式我覺得這是最簡單的拋出:

a,b,c = [{}]*3 
+1

不太可讀,但很有創意!我喜歡它! –

+3

看起來像這樣會將'a','b'和'c'設置爲同一個哈希實例。>> >> a,b,c = [{}] * 3#=> [{},{},{}] >> b [1] = 1#=> 1 >> a#=> {1 => 1} >> c#=> {1 = > 1}' –

+0

它將所有三個設置爲相同的散列值。原因是Ruby首先分配'{}',然後複製它三次。它不重複三個'{}'數組,然後分配它們。 –

1

我真的不知道我是否會使用,但它是可能的:

a, b, c = 3.times.map { Hash.new } 
#or 
a, b, c = (1..3).map { Hash.new } 

然而另一種答案..因爲你可以簡單地使用{},而不是Hash.new 的分配可能是這樣的:

a, b, c = 3.times.map{{}} 
相關問題