2011-07-09 50 views
6

我知道Ruby中的x == y解釋爲a.==(y)。我想檢查我是否可以達到同樣的定製方法,foo,像這樣:是== Ruby中的一種特殊方法嗎?

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中的一種特殊方法嗎?

回答

15

不,==在Ruby中不是特別的方法。這是一種像其他任何方法。你們看到的只是一個解析的問題:

a.x foo 4 

相同

a.x(foo(4)) 

督察,要傳遞foo(4)作爲參數傳遞給x,但x不帶任何參數。

,然而,特殊的運算符語法,它允許你寫的

a == b 

代替

a.== b 

運營商的有限清單:

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

此外,還有特殊的語法,可以讓你寫

!a 

~a 

,而不是

a.! 

a.~ 

除了

+a 

-a 

[email protected] 

[email protected] 

然後代替,有

a[b] 

a[b] = c 

,而不是

a.[] b 

a.[]= b, c 

和最後但並非最不重要

a.(b) 

,而不是

a.call b 
+1

真棒答案。我在這裏學到了東西。 – d11wtq

2

方法是運營商在Ruby中經過特殊處理的,至少語法明智的。語言是沒有,比如靈活,在Haskell在那裏你可以通過反引號包圍它的名字將任何功能於綴操作:在中綴運算符列表是預先確定的。

一個從定製綴會出現的問題是運算符優先級和結合的處理:對於eaxmple,解析器會如何處理這樣一種說法:

a foo b == C# should this be (a foo b) == c or a foo (b == c) 
相關問題