2013-07-07 73 views
1

我想這樣做:紅寶石圖示和<<運營商

a << *b 

,但這種情況發生在IRB:

1.9.3p327 :020 > a 
=> [1, 2, 3, 4] 
1.9.3p327 :021 > b 
=> [5, 6, 7] 
1.9.3p327 :022 > a << *b 
SyntaxError: (irb):22: syntax error, unexpected tSTAR 
a << *b 
    ^

我缺少的東西?

+0

會不會'A + B'對於這種使用情況更直觀? – scones

+2

您可以通過A + = B –

回答

3

看看這裏的原因:

a = [1, 2, 3, 4] 
b = [5, 6, 7] 
p a.<<(*b) 
# ~> -:3:in `<<': wrong number of arguments (3 for 1) (ArgumentError) 
# ~> from -:3:in `<main>' 

<<方法現在預計只有一個argument.So如下圖示(*)是運營商,這將創建5,6,7,這<<方法不希望,而是希望只有一個對象。因此Ruby的設計在b之前不允許*

a = [1, 2, 3, 4] 
b = [5, 6, 7] 
p a << * 
# ~> -:3: syntax error, unexpected * 

a = [1, 2, 3, 4] 
b = [5, 6, 7] 
p a << *b 
# ~> -:3: syntax error, unexpected * 
# ~> p a << *b 
# ~>  ^

這就是爲什麼2個合法錯誤:

  • 錯誤的參數數目(3 1)(引發ArgumentError)

  • 語法錯誤,意想不到的*

也許你可以使用 -

a = [1, 2, 3, 4] 
b = [5, 6, 7] 
p a.push(*b) 
# >> [1, 2, 3, 4, 5, 6, 7] 
+0

+1的解釋做:) –

1

簽名類型簽名:ary < < obj→ary。它只需要一個參數。嘗試:a.push(* B)(推(OBJ,...)→元)

4

試試這個:

a.concat(b) 

將輸出:

=> [1, 2, 3, 4, 5, 6, 7] 
5

我曾評論它早期的教,現在將它添加到回答;-)

A + = b會做你的工作

+1

* + 1 *給你..也;) –

+1

我喜歡這個答案,而不是那些試圖解釋如何使用'*'字符出於這個原因:想想看看這個代碼時其他人會如何迴應。你是否明顯知道你在做什麼,或誤導他們?關於Ruby的一個重要的事情是,即使它有一些非常棒的快捷鍵,簡單性也是關於優秀代碼的最大特徵。 –

+1

我同意。但是我也需要明白爲什麼事情會發揮作用,爲什麼他們不這樣做。 –

1

鑑於

a = [1, 2, 3, 4] 
b = [5, 6, 7] 

你想解決的辦法是

a.concat b 
# => [1, 2, 3, 4, 5, 6, 7] 

然而,你可能會發現這個有趣一點

b.each &a.method(:<<) 
a 
# => [1, 2, 3, 4, 5, 6, 7] 

這是說

「b中的每個元素調用方法a#<<」相當於

b.each &a.method(:push) 
a 
# => [1, 2, 3, 4, 5, 6, 7] 
+0

whoah?|很酷但不太可讀。 –

+0

@MichaelKMadison,我爲你增加了一個更「可讀」的版本...... – naomik