2012-03-16 16 views
7

này ném cho tôi một SystemStackError trong 1.9.2 Ruby ( nhưng làm việc trong Rubinius ):Làm thế nào tôi có thể xác định lại phương pháp + (cộng) của Fixnum trong Ruby và giữ nguyên + chức năng gốc?

class Fixnum 
    def +(other) 
    self + other * 2 
    end 
end 

nhưng không có super cho + (dựa trên các lỗi khác).

Tôi làm cách nào để truy cập chức năng + gốc?

+0

Chờ đợi, bạn đang nói điều này hoạt động như bạn mong đợi ở Rubinius? –

+0

Tôi vừa thử nghiệm nó, không hoạt động trong Rubinius. Phương thức ghi đè chỉ bị bỏ qua. –

+2

Bạn có chắc chắn muốn thực hiện việc này không? Đó là một khẩu súng chân hoàn toàn tự động nạp ngay tại đó. –

Trả lời

13

Sử dụng alias_method. Bí danh Fixnum 's + đến cái gì khác, sau đó đề cập đến nó trong mới +:

class Fixnum 
    alias_method :old_add, :+ 
    def +(other) 
    self.old_add(other) * 2 
    end 
end 
+1

Ngoài ra, việc này dường như thực sự gây nhầm lẫn IRB của tôi bằng cách nào đó, nhưng trong thực tế làm việc trong Ruby đồng bằng. –

+0

@NiklasB. Tôi thường cố gắng và không chỉnh sửa câu trả lời trong vài phút đầu tiên. Và mọi người dường như trộn lẫn cú pháp cho 'alias' so với' alias_method' rất nhiều. –

+3

@Andrew: Tôi không ngạc nhiên khi biết rằng * ghi đè thêm số nguyên freakin '* không giảm quá tốt cho IRb ... Đây là một bản hack tồi tệ đến nỗi tôi hầu như không thể mô tả nó thông qua các từ. –

1

Một cách tiếp cận thú vị sẽ phải vượt qua một khối phương pháp module_eval Fixnum của. Vì vậy, ví dụ:

module FixnumExtend 
    puts '..loading FixnumExtend module' 

    Fixnum.module_eval do |m| 
    alias_method :plus,  :+ 
    alias_method :min,  :- 
    alias_method :div,  :/ 
    alias_method :mult,  :* 
    alias_method :modu,  :% 
    alias_method :pow,  :** 

    def sqrt 
    Math.sqrt(self) 
    end 

    end 

end 

Bây giờ, sau bao gồm FixnumExtend suốt ứng dụng của tôi, tôi có thể làm:

2.plus 2 
=> 4 

81.sqrt 
=> 9 

Tôi đang sử dụng phương pháp này để giúp cơ OCR tôi nhận ra đang viết tay. Nó có thời gian dễ dàng hơn với 2.div 2 hơn 2/2.