Ruby splat和< < 运算符

flseospp  于 2023-08-04  发布在  Ruby
关注(0)|答案(5)|浏览(110)

我想这样做:

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
      ^


我错过了什么吗?

k4ymrczo

k4ymrczo1#

这条线将完成您的工作:

a += b

字符串

jecbmhm3

jecbmhm32#

试试这个:

a.concat(b)

字符串
它将输出:

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

x7yiwoj4

x7yiwoj43#

看看这里的原因:

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
 # ~>         ^


这就是为什么两个合法的错误:

  • 参数数目错误(3对1)(ArgumentError)
  • 语法错误,意外 *

或许你可以用-

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

yc0p9oo0

yc0p9oo04#

给予

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]

zpjtge22

zpjtge225#

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

相关问题