2009-09-26 29 views
5

Hãy nói rằng tôi có một lớp singleton như thế này:Làm thế nào để thêm các phương pháp lớp học thuận tiện cho một lớp Singleton trong ruby ​​

class Settings 
    include Singleton 

    def timeout 
    # lazy-load timeout from config file, or whatever 
    end 
end 

Bây giờ nếu tôi muốn biết những gì thời gian chờ để sử dụng Tôi cần phải viết một cái gì đó như:

Settings.instance.timeout 

nhưng tôi thà rút ngắn đó để

Settings.timeout 

Một cách rõ ràng để làm cho công việc này sẽ được thay đổi imple cố vấn về Cài đặt cho:

class Settings 
    include Singleton 

    def self.timeout 
    instance.timeout 
    end 

    def timeout 
    # lazy-load timeout from config file, or whatever 
    end 
end 

Điều đó có thể hữu ích, nhưng sẽ khá buồn khi viết ra phương pháp lớp cho từng phương pháp thể hiện. Đây là ruby, phải có một cách năng động thông minh để làm điều này.

Trả lời

10

Một cách để làm điều đó là như thế này:

require 'singleton' 
class Settings 
    include Singleton 

    # All instance methods will be added as class methods 
    def self.method_added(name) 
    instance_eval %Q{ 
     def #{name} 
     instance.send '#{name}' 
     end 
    } 
    end 


    def timeout 
    # lazy-load timeout from config file, or whatever 
    end 
end 

Settings.instance.timeout 
Settings.timeout 

Nếu bạn muốn kiểm soát hạt mịn thêm về những phương thức ủy, sau đó bạn có thể sử dụng các kỹ thuật Đoàn:

require 'singleton' 
require 'forwardable' 
class Settings 
    include Singleton 
    extend SingleForwardable 

    # More fine grained control on specifying what methods exactly 
    # to be class methods 
    def_delegators :instance,:timeout,:foo#, other methods 

    def timeout 
    # lazy-load timeout from config file, or whatever 
    end 

    def foo 
    # some other stuff 
    end 

end 

Settings.timeout 

Settings.foo 

Mặt khác bên cạnh, tôi khuyên bạn nên sử dụng các mô-đun nếu chức năng dự định bị giới hạn đối với hành vi, một giải pháp như vậy sẽ là:

module Settings 
    extend self 

    def timeout 
    # lazy-load timeout from config file, or whatever 
    end 

end 

Settings.timeout 
+1

Tuyệt vời câu trả lời. Trong trường hợp cụ thể của tôi, SingleForwardable chính xác là những gì tôi đang tìm kiếm. Cảm ơn! –

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