【问题标题】:Ruby splat and << operatorsRuby splat 和 << 运算符
【发布时间】:2013-07-04 20:40:06
【问题描述】:

我想这样做:

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 += b 做到这一点

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


【解决方案1】:

我之前已经评论过它,现在添加它来回答;-)

a += b 会做你的工作

【讨论】:

  • 我喜欢这个答案,而不是那些试图解释如何使用 * 字符的人,原因是:想想其他人在查看这段代码时会如何回应。你是把你在做什么显而易见,还是误导他们?关于 Ruby,要记住的重要一点是,尽管它确实有一些很棒的快捷方式,但简单是优秀代码的最大特点。
  • 我同意。但我还需要了解为什么事情有效,为什么不有效。
【解决方案2】:

试试这个:

 a.concat(b)

它会输出:

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

【讨论】:

    【解决方案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>'
    

    &lt;&lt; 方法只需要一个参数。所以现在如下所示 splat(*) 是一个运算符,它将创建 5,6,7&lt;&lt; 方法不期望它,而是只需要一个对象。因此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]
    

    【讨论】:

      【解决方案4】:

      检查类型签名:ary

      【讨论】:

        【解决方案5】:

        给定

        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#&lt;&lt;

        相当于

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-03-13
          • 2011-10-26
          • 2014-12-13
          • 2010-10-21
          • 2015-03-13
          • 2023-03-05
          • 1970-01-01
          相关资源
          最近更新 更多