2014-09-30 23 views
6

Cách đơn giản nhất để truy cập hằng số được bảo vệ của lớp được bao gồm trong bối cảnh Mối quan tâm của ActiveSupport :: Concern là gì?Truy cập hằng số được bảo vệ của lớp được bao gồm trong ActiveSupport :: Concern

Ví dụ lớp:

module Printable 
    extend ActiveSupport::Concern 

private 
    def print_constant 
     puts MY_CONSTANT 
    end 
end 

class Printer 
    include Printable 

    def print 
     print_constant 
    end 

private 
    MY_CONSTANT = 'Hello'.freeze 
end 

giải pháp này tạo ra một lỗi:

NameError: uninitialized constant Printable::MY_CONSTANT 

Tôi nhận thức được một sự thay thế mà dường như làm việc:

puts self.class::MY_CONSTANT 

Tuy nhiên, nó doesn không cảm thấy đúng. :-)

Bất kỳ đề xuất nào tốt hơn?

+2

Câu hỏi của bạn là câu trả lời của tôi. Trong khi tôi đồng ý rằng nó không cảm thấy đúng, câu hỏi của bạn cuối cùng đã cho tôi một giải pháp mà ít nhất là làm việc. –

Trả lời

0

Việc truy cập một hằng số của một lớp bao gồm từ một mối quan tâm thực sự không phải là một ý tưởng hay.

Một mối quan tâm không nên có (quá nhiều) kiến ​​thức của các lớp mà nó bao gồm trong

tôi sẽ đi cho một API phổ biến trong mối quan tâm và ghi đè lên khi cần thiết ... như thế này:.

module Printable 
    extend ActiveSupport::Concern 

private 
    def print 
     puts "" 
    end 
end 

class Printer 
    include Printable 

    def print 
     MY_CONSTANT 
    end 

private 
    MY_CONSTANT = 'Hello'.freeze 
end 
+1

Bạn sẽ có một phương pháp siêu lạm phát theo thứ tự (số lượng bao gồm các lớp) x (số phương pháp sử dụng hằng số) :) –

5

Trước hết, bạn nên đặt #print_constant thành một included khối:

module Printable 
    extend ActiveSupport::Concern 

    included do 
    private 

    def print_constant 
     puts MY_CONSTANT 
    end 
    end 
end 

Bây giờ có ít nhất hai cách để truy cập vào constan lớp t MY_CONSTANT:

  1. #included sản lượng với một tham số base tương tự như Ruby #included:

    module Printable 
        extend ActiveSupport::Concern 
    
        included do |base| 
        private 
    
        define_method :print_constant do 
         puts base::MY_CONSTANT 
        end 
        end 
    end 
    
  2. phương pháp khác là đi từ self.class:

    module Printable 
        extend ActiveSupport::Concern 
    
        included do 
        private 
    
        def print_constant 
         puts self.class::MY_CONSTANT 
        end 
        end 
    end 
    

ActiveSupport Concern Documentation

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