【发布时间】:2014-02-27 13:59:47
【问题描述】:
module HashInitialized
def hash_initialized(*fields)
define_method(:initialize) do |h|
missing = fields - h.keys
raise Exception, "Not all fields set: #{missing}" if missing.any?
h.each do |k,v|
instance_variable_set("@#{k}", v) if fields.include?(k)
end
end
end
end
class Cheese
extend HashInitialized
attr_accessor :color, :odor, :taste
hash_initialized :color, :odor, :taste
end
好吧,我明白了:
- 我们使用 HashInitialized 中的方法扩展 Cheese 类,因此模块 HashInitialized 中的方法 hash_initialized 可以作为 Cheese 中的类方法使用
- 我们将 3 个符号传递给 hash_initialized 方法
- 在 hash_initialized 方法中,这 3 个符号由于 * 运算符而被放入称为字段的数组中
- 在 hash_initialized 方法中我们定义了初始化方法
- 现在是我不明白的部分,|h| 是什么?指的是?为什么我们可以在 |h| 上调用 h.keys。好像是哈希,但我不明白它是如何传递到那里的。
- 然后我们迭代这个 |h|哈希,设置实例变量,这里一切都清楚了,除了 |h|响应每个,所以它必须是数组或哈希,我仍然不明白这些值来自哪里。
任何帮助表示赞赏!
代码取自 rubymonk.com,元编程 Ruby:Ascent
【问题讨论】:
标签: ruby metaprogramming