2012-05-03 34 views
6

Tôi có một số mã để tính tổng số thứ n của một số. Ngay bây giờ, phương thức đó chỉ hoạt động trên Fixnum, bởi vì tôi đã định nghĩa nó bên trong lớp Fixnum. Sẽ rất dễ dàng để thực hiệnThêm cùng một phương thức vào nhiều lớp

class Float 
    #same code as was in Fixnum 
end 

nhưng điều đó dường như không cần thiết. Tôi không có ý tưởng làm thế nào để tự động gọi các lớp học. Tôi đã thử:

classes = [Fixnum, Float] 
classes.each do |x| 
    x.instance_eval do 
     def root(pow) 
      return self ** (1/pow.to_f) 
     end 
    end 
end 

nhưng điều đó không hiệu quả. Làm thế nào để tôi làm điều này? Lưu ý: Sau khi đăng bài, tôi nhận ra điều này có thể phù hợp hơn với Programmers.SE, vì đó là lý thuyết, cũng như dựa trên vấn đề đơn. Cảm thấy tự do để di chuyển phù hợp ...

+2

Note rằng ở trên 'trả về' là không cần thiết (và là không thành ngữ). – Phrogz

Trả lời

8

Phần liên quan của hệ thống phân cấp lớp trông như thế này:

Vì vậy, vá thay đổi của bạn vào Numeric để trang trải tất cả chúng cùng một lúc:

class Numeric 
    def root(pow) 
    return self ** (1/pow.to_f) 
    end 
end 

Sau đó, bạn có thể làm những điều sau:

>> 11.root(2) # Fixnum 
=> 3.3166247903554 
>> 2.18.root(3) # Float 
=> 1.296638256974172 
>> Rational(23, 42).root(6) # Rational 
=> 0.9045094132598528 
>> 2**1000.root(42) # Bignum 
=> 2.2638347236157763 
7

Bạn sẽ muốn sử dụng #class_eval:

classes = [Fixnum, Float] 
classes.each do |x| 
    x.class_eval do 
     def root(pow) 
      return self ** (1/pow.to_f) 
     end 
    end 
end 

Xem this blog post như một tài liệu tham khảo.

Ngoài ra, bạn có thể tạo ra một mô-đun và bao gồm nó vào mỗi lớp:

module MyRoot 
    def root(pow) 
    return self ** (1/pow.to_f) 
    end 
end 

class Fixnum 
    include MyRoot 
end 

class Float 
    include MyRoot 
end 

tôi nghiêng về phía sau. Đó là rõ ràng hơn những gì bạn đang làm và cho phép thêm một lần nữa.

+0

+1 cho quyền nói chung, nhưng -1 vì không có câu trả lời đúng cho nhu cầu thực tế: kế thừa từ 'Numeric'. – Phrogz

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