2011-07-09 16 views
6

Ruby'deki x == y'un a.==(y) olarak yorumlandığını anlıyorum. == Ruby'de özel bir yöntem mi?

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) 

Maalesef bu işe yaramazsa: Ben böyle özel bir yöntem, foo, aynı elde edebilirsiniz olmadığını kontrol etmeye çalıştı. Neyi kaçırıyorum ? Ruby'de == özel bir yöntem mi var? Ruby'de özel bir yöntem değil.

cevap

15

Hayır, == özel bir yöntem değildir. Diğerleri gibi bir yöntem.

a.x foo 4 

, sen x bir argüman olarak foo(4) geçiyoruz

a.x(foo(4)) 

IOW aynıdır, ancak x herhangi bir bağımsız değişken almaz: Ne görüyorsanız sadece ayrıştırma konudur.

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

Ancak, operatörler sınırlı listesi için

a == b 

yerine

a.== b 

ait yazmasına olanak tanır özel operatör sözdizimi, olduğunu

Ayrıca,

!a 

ve

~a 

yerine

a.! 

ve

a.~ 

yanı sıra

yazmasına olanak tanır özel bir sözdizimi vardır
+a 

ve

[email protected] 

ve

sonra
[email protected] 

yerine

-a 

,

a[b] 
orada

ve

a[b] = c 

yerine

a.[] b 

ve

a.[]= b, c 

ve son ama en az

a.(b) 

yerine

a.call b 
+1

Müthiş cevap: eaxmple için, nasıl ayrıştırıcı gibi bir ifade müdahale edecek. Burada bir şey öğrendim. – d11wtq

2

Operatörler, özel olarak Ruby'de, en azından sözdizimsel olarak ele alınır. Dil, söz gelimi, Haskell'de, herhangi bir işlevi bir isim işareti operatörüne dönüştürebildiği kadar esnek değildir: ismini, infix operatörlerinin listesi önceden belirlenir. özel ekleri içermemelidir doğacak sorunlardan

Bir operatör önceliği ve ilişkilendirilebilirlik işlenmesidir:

a foo b == C# should this be (a foo b) == c or a foo (b == c) 
İlgili konular