首页 > 解决方案 > 如何使用实例变量值动态创建类方法

问题描述

让我们先看看代码,这将有助于我想要实现的目标:

class PostalInfo
  attr_reader :name, :code

  def initialize (id, name, code)
    @id = id
    @name = name
    @code = code
  end

  def method_missing(method, *args, &blk)
    if method.to_s == "#{name}"
      return code
    else
      super
    end
  end
end

pi1 = PostalInfo.new(1, 'united_states', 'US')
pi2 = PostalInfo.new(2, 'united_kingdom', 'UK')

所以当我运行下面的代码时,它给出的输出为:

pi1.united_states => 'US'
pi2.united_kingdom => 'UK'

到这里为止都很好,但我也想做类似的事情

PostalInfo.united_states => 'US'
PostalInfo.united_kingdom => 'UK'

怎么做,提前谢谢

标签: ruby

解决方案


你可以这样写:

class PostalInfo
  POSTAL_HASH = {
    united_states: 'US',
    united_kingdom: 'UK',
  }.freeze

  def self.method_missing(method, *args, &blk)
    POSTAL_HASH[method] || super
  end
end

跳过缺失的方法可能会带来更好的性能:

class PostalInfo
  POSTAL_HASH = {
    united_states: 'US',
    united_kingdom: 'UK',
  }.freeze

  class << self
    POSTAL_HASH.each do |name, code|
      define_method(name) do
        code
      end
    end
  end
end

推荐阅读