= = Ruby中的特殊方法吗?

Mis*_*hko 6 ruby methods equality

我理解x == y在Ruby中解释为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)
Run Code Online (Sandbox Code Playgroud)

不幸的是,这不起作用.我错过了什么?是==在Ruby中一种特殊的方法?

Jör*_*tag 15

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

a.x foo 4
Run Code Online (Sandbox Code Playgroud)

是相同的

a.x(foo(4))
Run Code Online (Sandbox Code Playgroud)

IOW,你foo(4)作为一个参数传递x,但x不接受任何争论.

还有就是然而,特殊的运算符语法,它允许你写

a == b
Run Code Online (Sandbox Code Playgroud)

代替

a.== b
Run Code Online (Sandbox Code Playgroud)

对于有限的运营商名单:

==
!=
<
>
<=
>=
<=>
===
&
|
*
/
+
-
%
**
>>
<<
!==
=~
!~
Run Code Online (Sandbox Code Playgroud)

此外,还有一些特殊的语法允许您编写

!a
Run Code Online (Sandbox Code Playgroud)

~a
Run Code Online (Sandbox Code Playgroud)

代替

a.!
Run Code Online (Sandbox Code Playgroud)

a.~
Run Code Online (Sandbox Code Playgroud)

以及

+a
Run Code Online (Sandbox Code Playgroud)

-a
Run Code Online (Sandbox Code Playgroud)

代替

a.+@
Run Code Online (Sandbox Code Playgroud)

a.-@
Run Code Online (Sandbox Code Playgroud)

然后,有

a[b]
Run Code Online (Sandbox Code Playgroud)

a[b] = c
Run Code Online (Sandbox Code Playgroud)

代替

a.[] b
Run Code Online (Sandbox Code Playgroud)

a.[]= b, c
Run Code Online (Sandbox Code Playgroud)

最后但并非最不重要

a.(b)
Run Code Online (Sandbox Code Playgroud)

代替

a.call b
Run Code Online (Sandbox Code Playgroud)