2009-08-16 38 views
5

Tôi đã nhìn thấy làm thế nào để quá tải +* trong Ruby, do đó my_obj + other cuộc gọi my_obj.+(other). Trong Python, bạn làm điều này với __add__, và có một tương ứng __radd__ cho quá tải other + my_obj. Có thực sự không có sự bổ sung/nhân đôi bên phải tương đương nào trong Ruby, và điều đó có cần thiết để xác định lại + cho mỗi lớp tiềm năng của other không?Sự tồn tại của phép cộng/phép nhân trong ruby?

Tóm lại: giả sử tôi có một đối tượng X thuộc về một số lớp mới do tôi xác định. Thật dễ dàng để viết mã cho X + 5, nhưng có vẻ như để xử lý 5 + X tôi cần phải xác định lại Fixnum.+. Điều này có đúng không?

+1

Tôi nên làm rõ: Tôi muốn 5 + X (và X + 5) để trả về một đối tượng tùy chỉnh mà tôi chọn và không chỉ là số nguyên hoặc dấu phẩy. – Peter

+0

Xác định truy tìm cưỡng bức đó. – sepp2k

Trả lời

6

Không, bạn không cần phải xác định lại Fixnum # + (hoặc bất kỳ phương pháp số học nào khác của các lớp số của ruby). Các phương pháp số học của các lớp số sẽ gọi coerce nếu hai toán hạng không cùng một lớp. Vì vậy, nếu bạn định nghĩa một phương thức ép buộc cho lớp của mình, 5 + instance_of_your_class sẽ hoạt động tốt mà không có bất kỳ thay đổi nào đối với Fixnum # +.

Edit: Đây là một ví dụ của việc sử dụng ép buộc:

class MyNum 
    attr_accessor :num 

    def initialize(num) 
    @num = num 
    end 

    def +(o) 
    lhs, rhs = coerce(o) 
    MyNum.new(lhs.num + rhs.num) 
    end 

    def coerce(o) 
    if o.is_a? MyNum 
     [self, o] 
    else 
     [self, MyNum.new(o)] 
    end 
    end 
end 

MyNum.new(5)+3 #=> #<MyNum:0x87fca08 @num=8> 
3+MyNum.new(5) #=> #<MyNum:0x8807980 @num=8> 
+0

tuyệt vời, điều này là hoàn hảo, cảm ơn! – Peter

-1

Có. Nếu bạn muốn thay đổi hành vi trên 5 + x, bạn phải xác định lại + trên bất kỳ 5 là gì, vì bạn đang thực tế gọi 5.+(x) vì Ruby xử lý các loại hoạt động này dưới dạng cuộc gọi mechod.

0

Các RHS được ép buộc và cần phải thực hiện các phương pháp to_i mà cần phải trả lại một giá trị thích hợp. Việc thực hiện các lớp học của Numeric to_int sẽ kết thúc gọi nó như là một phần của quá trình bổ sung mà các lớp khác có liên quan đến RHS hơn là con cháu Numeric nghiêm ngặt.

Các vấn đề liên quan