ruby - 如何使用实例变量值动态创建类方法
问题描述
让我们先看看代码,这将有助于我想要实现的目标:
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'
怎么做,提前谢谢
解决方案
你可以这样写:
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
推荐阅读
- r - 如何在网站上发布 R 代码和图表(Markdown)?
- python - 从文件执行 Google Vision API 文本检测时出错
- ios - 从后台返回时不会调用 iOS viewWillAppear,即使在 iOS 13+ 中使用 UIModalPresentationStyle.FullScreen
- python - 如何在使用转义或引号在pyspark中的文件中写入数据帧时获得完全匹配?
- php - 使用php向后获取每个单词
- python - plotly 似乎无法在 pycharm 中创建我的交互式绘图
- javascript - 如何制作一个可重用的函数,以便我保持 DRY 的良好实践?
- c++ - C++ 中的可输出特性:SFINAE 总是选择一种实现而不是另一种实现
- java - @RequiredArgsConstructor 不生成构造函数
- mongodb - 具有多个条件的聚合和项目