==是Ruby中的一个特殊方法吗?

==是Ruby中的一个特殊方法吗?,ruby,methods,equality,Ruby,Methods,Equality,我知道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 p

我知道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中不是一种特殊的方法。这是一种和其他方法一样的方法。您看到的只是一个解析问题:

a.x foo 4

a.x(foo(4))
现在,您正在将
foo(4)
作为参数传递给
x
,但是
x
不接受任何参数

但是,有一种特殊的运算符语法,允许您编写

a == b
!a
而不是

a.== b
a.!
a.+@
a.[] b
a.call b
对于有限的运营商名单:

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

而不是

a.== b
a.!
a.+@
a.[] b
a.call b

以及

+a

而不是

a.== b
a.!
a.+@
a.[] b
a.call b

然后是

a[b]

而不是

a.== b
a.!
a.+@
a.[] b
a.call b

最后但并非最不重要

a.(b)
而不是

a.== b
a.!
a.+@
a.[] b
a.call b

作为运算符的方法在Ruby中是专门处理的,至少在语法方面是这样。这种语言不像Haskell中那样灵活,在Haskell中,您可以通过将任何函数的名称包含在回号中来将其转换为中缀运算符:中缀运算符的列表是预先确定的

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

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