用于init()设置程序的Ruby类变量

时间:2019-02-01 17:32:00

标签: ruby class instance-variables populate

如何从我想存放在类定义中的配置哈希中填充实例变量?我有一个开发和一组production值,我想将它们推入initialize()的实例变量中。我该怎么做?

这是我所拥有的:

class Alpha

    CONFIG = {  development: {mid: '123', uid: 'trial', pin: 'abcde' },
        production: {mid: '65432', uid: 'go_go_go', pin: 'kwir7' }
        }

    def initialize(environment = 'development')
        @env = environment
        @mid = nil
        @uid = nil
        @pin = nil
    end

end

a = Alpha.new('development)
puts a.inspect      
# ==> #<Alpha:0x00007fb1228d6b68 @env="development", @mid=nil, @uid=nil, @pin=nil>

我想使用Config常量来填充三个空的实例变量。理想情况下,我想在initalize()中设置它们,但是可以调用private method来设置这些值。挑战仍然是相同的,使用class variableconstant来抓住它,我似乎无法实现这一目标。我假设将这样的帐户key-value pairs放在class definition内是这种应用程序的最佳做法。即:电子商务帐户指标。

我尝试了以下操作,但似乎无法正确引用Config哈希值。

@mid = Alpha::Config[environment.to_s][:mid]

只是为了让没有人对这篇文章不满意,在这些帖子中没有回答了问题:

Ruby: defining class level hash with default values

Confusion about ruby class variable

1 个答案:

答案 0 :(得分:3)

请记住,在Ruby中,符号和字符串并不等效,因此在使用符号键的哈希表中查找时必须进行显式转换:

class Alpha
  CONFIG = {
    development: { mid: '123', uid: 'trial', pin: 'abcde' },
    production: { mid: '65432', uid: 'go_go_go', pin: 'kwir7' }
  }

  attr_reader :mid, :uid, :pid

  def initialize(environment = 'development')
    @env = environment.to_sym

    @mid = CONFIG.dig(@env, :mid)
    @uid = CONFIG.dig(@env, :uid)
    @pid = CONFIG.dig(@env, :pid)
  end
end

现在可以使用了

Alpha.new('development').mid
# => "123"

在分配.to_sym时,@env调用将负责转换,然后可以在该点之后使用它。 dig用于避免在未定义特定环境的情况下崩溃,而值只是出现在nil上。