【问题标题】:Why Does Ruby Only Permit Certain Operator Overloading为什么 Ruby 只允许某些运算符重载
【发布时间】:2010-09-10 17:00:04
【问题描述】:

在 Ruby 中,与许多其他 OO 编程语言一样,运算符是可重载的。但是,只能重载某些字符运算符。

此列表可能不完整,但以下是一些不能重载的运算符:

!, not, &&, and, ||, or

【问题讨论】:

    标签: ruby methods operators operator-overloading


    【解决方案1】:

    在 Ruby 1.9 中,! 运算符实际上也是一个方法,可以被覆盖。这只剩下 &&|| 以及它们的低优先级对应物 andor

    还有一些其他“组合运算符”不能被覆盖,例如a != b 实际上是!(a == b)a += b 实际上是a = a+b

    【讨论】:

    • 如何覆盖 "+=" 方法?以及如何添加“++”方法?
    • 您不能覆盖 += 方法,因为正如我在回答中已经解释的那样,没有 += 运算符,因此不能有对应的方法。 ++ 不是有效标识符,所以需要使用反射来创建这样的方法:define_method(:'++') do |arg| puts "Hello from #{__callee__} with #{arg}" end; __send__(:'++', 42)
    【解决方案2】:

    我们不要忘记<<,例如:

    string = "test"
    string << "ing"
    

    和调用一样:

    string.<<("ing")
    

    【讨论】:

      【解决方案3】:

      是的。运算符不可重载。只有方法。

      有些运营商不是真的。它们是方法的糖。所以5 + 5 真的是5.+(5),而foo[bar] = baz 真的是foo.[]=(bar, baz)

      【讨论】:

        【解决方案4】:

        【讨论】:

        • 其实这不是问题。您可以将其翻译成a.&amp;&amp; { b },而不是将a &amp;&amp; b 翻译成a.&amp;&amp;(b)。块 do 提供惰性求值。
        【解决方案5】:

        方法是可重载的,它们是语言语法的一部分。

        【讨论】:

        • 正如 Jorg 在他的回答中提到的,! 可以被覆盖。
        • 如何覆盖 "+=" 方法?以及如何添加“++”方法?
        猜你喜欢
        • 1970-01-01
        • 2015-04-25
        • 2011-09-04
        • 2017-09-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-03
        • 2020-02-27
        相关资源
        最近更新 更多