Ruby 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
      ^

我是不是错过了什么?

这一行将完成您的工作:

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)

相关内容

  • 没有找到相关文章

最新更新