我想这样做:
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
^
我是不是错过了什么?
这一行将完成您的工作:
a += b
试试这个:
a.concat(b)
它将输出:
=> [1, 2, 3, 4, 5, 6, 7]
在这里查找原因:
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]
给定
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]
检查类型签名:ary<lt;obj→ary。它只需要一个参数。尝试:a.push(*b)(push(obj,…)→ary)