gpt4 book ai didi

ruby - 类方法中的 define_method

转载 作者:太空宇宙 更新时间:2023-11-03 17:48:11 24 4
gpt4 key购买 nike

在下面的代码中,模块被扩展,这意味着方法 hash_initialized 被视为类方法,或 eigen 类的实例方法。这是我们需要的,因为 hash_initialized 是在本征类的上下文中调用的。

我不明白的是,如果模块的上下文是特征类,那么 define_method 应该创建一个名为“初始化”的特征类的实例方法,或者换句话说,类 Cheese 的类方法。我们这里不需要实例方法“初始化”吗?

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

最佳答案

从技术上讲,调用 extend 会将模块放入调用它的本征对象的查找链中,在这种情况下,本征对象与类对象相同。所以你是正确的,hash_initialized 的上下文是类。此外,您认为 define_method 的上下文是类是正确的。但是,您的最后一步不正确。当在该上下文中调用 define_method 时,它定义了一个实例方法,而不是单例方法。

IOW,当您在上下文中调用 define_method 时,它会在 def 将在该上下文中定义它的相同位置定义方法。

关于ruby - 类方法中的 define_method,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30745662/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com