【问题标题】:Get class variable from class directly直接从类中获取类变量
【发布时间】:2014-10-29 08:06:34
【问题描述】:

以下模块:

class EnvParams
  def self.mailer
    environment.mailer
  end

  def self.router
    environment.router
  end

  def self.sms_gateway
    environment.sms_gateway
  end

  private

  def self.environment
    @@env ||= Hashie::Mash.new({data: {
        mailer: {
            address: ENV['DISP_MAILER_SERVER'],
            domain: ENV['DISP_MAILER_DOMAIN'],
            port: ENV['DISP_MAILER_PORT'],
            user_name: ENV['DISP_MAILER_USERNAME'],
            password: ENV['DISP_MAILER_PASSWORD'],
            sender: ENV['DISP_MAILER_SENDER']
        },
        router: {
            url: ENV['GTC_ROUTER_URL']
        },
        sms_gateway: {
            url: ENV['SMS_GATEWAY_URL']
        }
    }}).data
  end
end

已创建以将所有对环境变量的引用集中在一个文件中,并旨在以这种方式查询环境变量:

EnvParams.mailer.password

我不喜欢一堆def self.mailerdef self.routerdef self.sms_gateway getter - 每个部分一个。如果出现新部分,则必须定义新的 getter。如何避免这种情况而不必调用像 EnvParams.environment.mailer.password 这样的中间吸气剂?

【问题讨论】:

    标签: ruby


    【解决方案1】:

    Forwardable 是一个更好的解决方案,但要提供另一种选择,您可以动态创建方法:

    class A
      def self.method_missing(name, *args, &blk)
        define_singleton_method name.to_sym do 
          environment.send(name.to_sym)
        end 
        self.send(name.to_sym)
      end
    end
    

    我的灵感来自here。这适用于 Ruby 1.9。

    【讨论】:

    • 太棒了!这里有一些需要改进的地方:如果@@env 不包含请求的名称,则抛出NoMethodError 异常。
    【解决方案2】:

    您可以使用 Forwardable 模块 (http://www.ruby-doc.org/stdlib-2.0/libdoc/forwardable/rdoc/Forwardable.html) 中的委托人

    class EnvParams
      extend Forwardable
    
      def_delegator :environment, :mailer
    end
    

    【讨论】:

      猜你喜欢
      • 2022-01-20
      • 1970-01-01
      • 1970-01-01
      • 2018-07-30
      • 1970-01-01
      • 2013-10-04
      • 2012-08-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多