2011-07-09 12 views
6

मुझे लगता है कि x == y रूबी में a.==(y) के रूप में व्याख्या की गई है।== रूबी में एक विशेष विधि है?

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, इस तरह के साथ एक ही प्राप्त कर सकते हैं की जाँच करने की कोशिश की। मैं क्या खो रहा हूँ ? == रूबी में एक विशेष विधि है?

उत्तर

15

नहीं, == रूबी में एक विशेष विधि नहीं है। यह किसी अन्य की तरह एक विधि है। क्या आप देख रहे हैं बस एक पार्स मुद्दा है:

a.x foo 4 

रूप

a.x(foo(4)) 

IOW एक ही है, आप x लिए एक तर्क के रूप foo(4) से गुजर रहे हैं, लेकिन किसी भी 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) 
बजाय

012,
a.call b 
+1

बहुत बढ़िया जवाब: eaxmple के लिए, कैसे पार्सर की तरह एक बयान संभाल होगा। मैंने यहाँ कुछ सीखा। – d11wtq

2

तरीके है कि ऑपरेटर हैं, रूबी में विशेष रूप से व्यवहार कर रहे हैं कम से कम वाक्य रचना के लिहाज से। भाषा, जैसा कि कहें, हस्केल में लचीला नहीं है, जहां आप बैकटिक्स में अपना नाम संलग्न करके किसी भी फ़ंक्शन को इंफिक्स ऑपरेटर में बदल सकते हैं: इन्फिक्स ऑपरेटरों की सूची पूर्व-निर्धारित होती है।

समस्याओं कि कस्टम infixes से पैदा होता में से एक ऑपरेटर पूर्वता और संबद्धता का उपयोग होता है:

a foo b == C# should this be (a foo b) == c or a foo (b == c) 
संबंधित मुद्दे