【问题标题】:Is == a special method in Ruby?== 是 Ruby 中的一种特殊方法吗?
【发布时间】:2011-07-09 10:27:16
【问题描述】:

我知道 Ruby 中的 x == y 被解释为 a.==(y)。我尝试检查是否可以使用自定义方法 foo 实现相同的效果,如下所示:

class Object
  def foo(n)
    self == n
  end
end

class A
  attr_accessor :x
end

a = A.new
a.x = 4

puts a.x.==(4)   # => true
puts a.x.foo(4)  # => true

puts a.x == 4    # => true
puts a.x foo 4   # => in `x': wrong number of arguments (1 for 0) (ArgumentError)

很遗憾,这不起作用。我错过了什么? == 是 Ruby 中的特殊方法吗?

【问题讨论】:

    标签: ruby methods equality


    【解决方案1】:

    不,== 不是 Ruby 中的特殊方法。这是一种与其他任何方法一样的方法。您所看到的只是一个解析问题:

    a.x foo 4
    

    一样
    a.x(foo(4))
    

    IOW,您将 foo(4) 作为参数传递给 x,但 x 不接受任何参数。

    ,但是,特殊的操作符语法,它可以让你写

    a == b
    

    而不是

    a.== b
    

    对于有限的运营商列表:

    ==
    !=
    <
    >
    <=
    >=
    <=>
    ===
    &
    |
    *
    /
    +
    -
    %
    **
    >>
    <<
    !==
    =~
    !~
    

    另外,还有一些特殊的语法可以让你写

    !a
    

    ~a
    

    而不是

    a.!
    

    a.~
    

    还有

    +a
    

    -a
    

    而不是

    a.+@
    

    a.-@
    

    然后,有

    a[b]
    

    a[b] = c
    

    而不是

    a.[] b
    

    a.[]= b, c
    

    最后但并非最不重要的一点

    a.(b)
    

    而不是

    a.call b
    

    【讨论】:

      【解决方案2】:

      作为运算符的方法在 Ruby 中被特殊对待,至少在语法方面是这样。这种语言不像在 Haskell 中那样灵活,您可以通过将任何函数的名称括在反引号中来将其转换为中缀运算符:中缀运算符的列表是预先确定的。

      自定义中缀会引起的问题之一是运算符优先级和关联性的处理:例如,解析器将如何处理如下语句:

      a foo b == c # should this be (a foo b) == c or a foo (b == c)
      

      【讨论】:

        猜你喜欢
        • 2011-07-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-26
        • 1970-01-01
        • 2016-06-24
        相关资源
        最近更新 更多