2011-07-09 12 views
6

Rubyのx == ya.==(y)と解釈されています。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) 

残念ながら、これは動作しません:私は、私はこのように、カスタムメソッド、fooと同じことを達成できるかどうかをチェックしてみました。私は何が欠けていますか? ==はRubyの特別な方法ですか?

答えて

15

いいえ、==はRubyでは特別な方法ではありません。他のどのような方法でもあります。

a.x foo 4 

は、あなたがxの引数としてfoo(4)を渡している

a.x(foo(4)) 

IOWと同じですが、xは引数をとりません:あなたが見ていることは、単に解析問題です。

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

は、しかし、あなたは事業者の限られたリストについては、

a == b 

代わり

a.== b 

の書き込みを可能にする特別なオペレータ構文です

はまた、あなたの代わりに

a.! 

a.~ 

と同様に

!a 

~a 

を書くことができ、特別な構文があります

+a 

-a 

代わりに

[email protected] 

[email protected] 

そして、

a[b] 
0123があります

a[b] = c 

代わりの

a.[] b 

a.[]= b, c 

と最後ではなく、少なくとも

a.(b) 

の代わり

a.call b 
+1

素晴らしい答え:eaxmpleのために、どのようにパーサのような声明を処理します。私はここで何かを学んだ。 – d11wtq

2

演算子は、Rubyでは少なくとも構文に基づいて特別に扱われます。言語は、例えば、ハスケルのように、バックスティックで名前を囲むことで、関数を中置演算子に変えることはできません。中置演算子のリストはあらかじめ決められています。

カスタム挿入辞から生じるであろう問題の一つは、オペレータの優先順位と結合の取り扱いです:

a foo b == C# should this be (a foo b) == c or a foo (b == c) 
関連する問題