Ruby splat和<<运营商

时间:2013-07-07 09:47:24

标签: ruby-on-rails ruby bit-shift splat

我想这样做:

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
      ^

我错过了什么吗?

5 个答案:

答案 0 :(得分:5)

我之前评论过它,现在将其添加回答; - )

a + = b将完成你的工作

答案 1 :(得分:4)

试试这个:

 a.concat(b)

它会输出:

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

答案 2 :(得分: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>'

<<方法只需要一个参数。现在,如下所示,splat(*)是一个运算符,它将创建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]

答案 3 :(得分:1)

检查类型签名:ary&lt;&lt; obj→ary。它只需要一个参数。尝试:a.push(* b)(推(obj,...)→ary)

答案 4 :(得分: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]