2010-12-30 32 views
5

Yakında buraya Ruby'ye dönüştürme. Aşağıdaki soru gerçekten pratik değildir; Ruby'nin iç yapısının nasıl çalıştığıyla ilgili bir soru. Çoklu girişleri kabul etmek için standart ekleme operatörünü geçersiz kılmak mümkün mü? Ek operatörün standart bir kişi olduğu göz önüne alındığında, cevabın hayır olduğunu varsayardım, ama bir şey kaçırmadığımdan emin olmak istedim.ruby'de + operatörü hakkında soru var

Düşüncelerimi doğrulamak için yazdığım kod aşağıdadır. Not, tamamen önemsiz/contrived.

class Point 
    attr_accessor :x, :y 

    def initialize(x,y) 
     @x, @y = x, y 
    end 


    def +(x,y) 
     @x += x 
     @y += y 
    end 


    def to_s 
     "(#{@x}, #{@y})" 
    end 
end 

pt1 = Point.new(0,0) 
pt1 + (1,1) # syntax error, unexpected ',', expecting ')' 

cevap

8

+ işlecini uygularken nesneyi değiştirmemelisiniz. Bunun yerine, yeni bir Point Object

class Point 
    attr_accessor :x, :y 

    def initialize(x,y) 
     @x, @y = x, y 
    end 


    def +(other) 
     Point.new(@x + other.x, @y + other.y) 
    end 


    def to_s 
     "(#{@x}, #{@y})" 
    end 
end 

ruby-1.8.7-p302 > p1 = Point.new(1,2) 
=> #<Point:0x10031f870 @y=2, @x=1> 
ruby-1.8.7-p302 > p2 = Point.new(3, 4) 
=> #<Point:0x1001bb718 @y=4, @x=3> 
ruby-1.8.7-p302 > p1 + p2 
=> #<Point:0x1001a44c8 @y=6, @x=4> 
ruby-1.8.7-p302 > p3 = p1 + p2 
=> #<Point:0x1001911e8 @y=6, @x=4> 
ruby-1.8.7-p302 > p3 
=> #<Point:0x1001911e8 @y=6, @x=4> 
ruby-1.8.7-p302 > p1 += p2 
=> #<Point:0x1001877b0 @y=6, @x=4> 
ruby-1.8.7-p302 > p1 
=> #<Point:0x1001877b0 @y=6, @x=4> 
+0

Bu uygulamayı, en mantıklı olanı kabul ediyorum, ancak bu daha çok iş başında yavaş bir deneydi. – aosik

3

Böyle + yöntemini tanımlayabilirsiniz, ancak yalnızca normal bir yöntem çağrısı sözdizimini kullanarak adlandırmak mümkün olacak:

pt1.+(1,1) 
0

Sen benzer bir şey elde edebilirsiniz kullanarak diziler:

pt1 + [1, 1] 
:
def +(args) 
    x, y = args 
    @x += x 
    @y += y 
end 

ve üstü olarak kullanabilirsiniz 0

Ayrıca, her iki diziyi de kabul etmek ve argüman olarak Puanları kabul etmek için bunu Chandra'nın çözümüyle birleştirebilirsiniz.

+0

teşekkürler! Bunun gibi bir şey olacağını düşündüm. – aosik