2009-12-13 26 views
12

Tôi có một lớp với hằng số được xác định cho nó. Sau đó tôi có một phương thức lớp được định nghĩa để truy cập hằng số lớp đó. Điều này hoạt động tốt. Một ví dụ:(Trong Ruby) cho phép các phương thức lớp hỗn hợp truy cập vào các hằng số lớp học

#! /usr/bin/env ruby 

class NonInstantiableClass 
    Const = "hello, world!" 
    class << self 
     def shout_my_constant 
      puts Const.upcase 
      end 
     end 
    end 

NonInstantiableClass.shout_my_constant 

Vấn đề của tôi nảy sinh trong cố gắng để di chuyển phương pháp lớp này ra một mô-đun bên ngoài, như vậy:

#! /usr/bin/env ruby 

module CommonMethods 
    def shout_my_constant 
     puts Const.upcase 
     end 
    end 

class NonInstantiableClass 
    Const = "hello, world!" 
    class << self 
     include CommonMethods 
     end 
    end 

NonInstantiableClass.shout_my_constant 

của Ruby giải thích phương pháp như yêu cầu một hằng số từ các mô-đun, chứ không phải là lớp học:

line 5:in `shout_my_constant': uninitialized constant CommonMethods::Const (NameError) 

Vì vậy, bạn cần phải làm gì để phương pháp tiếp cận lớp học? Cảm ơn nhiều.

Trả lời

14

Điều này dường như làm việc:

#! /usr/bin/env ruby 

module CommonMethods 
    def shout_my_constant 
     puts self::Const.upcase 
    end 
end 

class NonInstantiableClass 
    Const = "hello, world!" 
    class << self 
     include CommonMethods 
    end 
end 

NonInstantiableClass.shout_my_constant 

HTH

+0

Vâng, điều đó sẽ xóa mọi thứ. Tôi chưa trải nghiệm cú pháp ::. – jameshfisher

+0

Đừng dừng đọc ngay bây giờ. Đọc dưới đây johannes phản ứng. – Sebastian

9

Vấn đề là, nếu bạn chỉ cần viết Const nó được đánh giá trên gian tạo Module. Bạn phải sử dụng Module#const_get thay thế như thế này: const_get(:Const). Điều này được đánh giá khi chạy khi phương thức được thực thi. Điều này xảy ra trong lớp học của bạn chứ không phải trong mô-đun của bạn.

+0

Cảm ơn! Đó là loại phương pháp tôi đang tìm kiếm, không thành công. – jameshfisher

12

Cần lưu ý rằng bạn không cần phải bao gồm các mô-đun vào metaclass.

class NonInstantiableClass 
    Const = "hello, world!" 
    class << self 
     include CommonMethods 
    end 
end 

Ruby có từ khóa extend bổ sung hiệu quả giao diện mô-đun cho một lớp, ví dụ:

class NonInstantiableClass 
    Const = "hello, world!" 
    extend CommonMethods 
end 

Bạn vẫn cần phải đảm bảo bạn đang tham khảo hằng số đúng bằng self::Const hoặc const_get, nhưng extend <module> là cách tốt hơn để thêm những phương thức cho lớp.

+0

Một nhận xét hữu ích khác. Tôi đã học được ba điều từ việc hỏi một câu hỏi. – jameshfisher

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