【问题标题】:What does "<<" exactly do in ruby?“<<”在红宝石中究竟做了什么?
【发布时间】:2012-03-01 08:33:33
【问题描述】:

我是 Ruby 新手,所以我还在学习一些东西。但是,我在 Java 和 C 方面确实有很好的经验。

我想知道这到底是做什么的:

[ 'a','b', 'c' ].each_with_index {|item, index| result << [item, index] }

具体来说,我对&lt;&lt; 感兴趣。一些研究告诉我它是用于位移的,但很明显这里不是这样,那么它在这里做什么呢?

【问题讨论】:

  • 顺便说一下,这大致相当于首选的results = ['a', 'b', 'c'].each_with_index.to_a
  • @NiklasB。我会说它完全等效(而且相当漂亮)。
  • @Andrew: 除非results 之前是空的...还有一个,顺便说一句,它不是那么漂亮:['a', 'b', 'c'].zip(0..(1.0/0)):D
  • @NiklasB。啊,没想到。但是你可以只做results + [...].each_...。我也喜欢第二个,但我认为直接使用 Float::INFINITY 会让您更明显地尝试获得无限范围。
  • @Andrew:是的,但是Float::INFINITY 根本不会打字。

标签: ruby-on-rails ruby object operators


【解决方案1】:

&lt;&lt; 运算符在这种情况下将项目添加到结果数组中。

见“ how to add elements to ruby array (solved)”。

【讨论】:

    【解决方案2】:

    在 Ruby 中,所有 C/Java 中的运算符,如 +、-、*、/ 等,实际上都是方法调用。您可以根据需要重新定义它们。

    class MyInteger
      def +(other)
        42 # or anything you want
      end
    end
    

    Array 将&lt;&lt; 方法定义为“将此项推到此数组的末尾”。对于整数,它被定义为进行位移。

    除了 Array 之外,许多其他类都定义了 &lt;&lt; 来表示某种“附加”操作。

    【讨论】:

    • 警告:以意想不到的方式重新定义运算符可能会导致代码维护和调试问题,并最终导致疯狂。
    • 重新定义 + 总是返回 42 绝对是疯了。 (我确实尝试在irb 中重新定义Fixnum#+ 一次,而irb 变得非常混乱。)但是在Ruby 中的自定义类上定义运算符并不一定是坏事。因为所有运算符都是方法调用,所以当你看到一个运算符时,你预计它可能是对用户定义的方法的调用。
    • 但是很容易滥用运算符重载,我们在 90 年代用 C++ 吸取了这一教训。此外,你应该返回 11,没有 amp 去 42。
    • 你们都完全正确。我只是在说明 Ruby 的“运算符重载”并不像 C++ 运算符重载那样相当,因为您不必怀疑给定的运算符是否“真的”是一个运算符,或者是否它超载了;你知道这是一个方法调用,因为所有操作符都是方法调用。
    【解决方案3】:

    这是Array append operator

    &lt;&lt; 是一个方法,会为不同的类做不同的事情。 Array 使用它将对象推送到数组的末尾。 Fixnums use it to shift.

    【讨论】:

      【解决方案4】:

      这基本上是一个附加运算符。

      用于将元素附加到数组或将子字符串附加到字符串

      对于数组

      1.9.2-p290 :009 > arr = [1,2,3,4,5]

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

      1.9.2-p290 :010 > arr

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

      1.9.2-p290:011 >

      对于字符串

      1.9.2-p290 :011 > str = "红宝石"

      => "ruby" 
      

      1.9.2-p290 :012 > str

      => "rubyrails" 
      

      1.9.2-p290:013 >

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-18
        • 2012-07-23
        • 2016-09-10
        • 2023-03-15
        • 2012-10-17
        • 2021-06-04
        • 1970-01-01
        • 2018-07-30
        相关资源
        最近更新 更多