2011-11-28 21 views
2

我可以編寫以下...在Rails 3.1中可以使用<<運算符插入多個對象嗎?

 raw_data.categories.each do |category| 
      obj.categories << category 
     end 

作爲替代以下? ...

 obj.categories << raw_data.categories 
+1

...你試過了嗎? –

+2

@PlatinumAzure:你*嘗試過嗎? –

+0

@PlatinumAzure:是的,它不起作用。但是Mori的解決方案完美無缺! – Jacob

回答

9
obj.categories |= raw_data.categories 
+1

的Rails從未停止驚奇! – Jacob

+0

這可能是* right *在這裏做的事情,但它* *不等同於以前的代碼。 'obj.categories + = raw_data.categories'更靠近@雅各布的代碼,但'obj.categories.concat(raw_data.categories)'或'obj.categories.push(* raw_data.categories)'相當於@雅各布的代碼。 –

+0

@Mori:你現在使用的'+ ='和'| ='之間有什麼區別? + =也起作用。 – Jacob

8

看看Array#<<Array#push

Array#<<需要一個其代替追加到給定的數組。例如:

irb> array = %w[ a b c ]  # => ["a", "b", "c"] 
irb> array << 'd'    # => ["a", "b", "c", "d"] 

然而,如果傳遞的陣列,系統會在結果

irb> array << ['e', 'f', 'g'] # => ["a", "b", "c", "d", ["e", "f", "g"]] 

Array#push驚訝可以處理1+​​對象,其每一個被附加到陣列。

irb> array = %w[ a b c ]   # => ["a", "b", "c"] 
irb> array.push 'd'    # => ["a", "b", "c", "d"] 

但是,調用#push使用數組給你同樣的結果#<<

irb> array.push ['e', 'f', 'g'] # => ["a", "b", "c", "d", ["e", "f", "g"]] 

爲推動所有陣列中的元件,只是第二陣列之前添加*

irb> array.push *['e', 'f', 'g'] # => ["a", "b", "c", "d", "e", "f", "g"] 

在相關說明中,儘管Array#+確實連接了數組,但它也會允許重複值。

irb> array = %w[ a b c ]   # => ["a", "b", "c"] 
irb> array += ['d']    # => ["a", "b", "c", "d"] 
irb> array += ['d']    # => ["a", "b", "c", "d", "d"] 

如果這是不需要的,在|運算符將返回兩個數組的聯合,沒有重複的值。

irb> array = %w[ a b c ]   # => ["a", "b", "c"] 
irb> array |= ['d']    # => ["a", "b", "c", "d"] 
irb> array |= ['d']    # => ["a", "b", "c", "d"]