gpt4 book ai didi

ruby - ruby 中的模块扩展和 class_eval

转载 作者:数据小太阳 更新时间:2023-10-29 08:20:26 25 4
gpt4 key购买 nike

我正在测试元编程,但有一个案例我不明白:

module Bar
def self.append_features klass
klass.class_eval do
def self.a
puts 'a'
end
end
end
end

class Foo
extend Bar
end

定义“a”方法在哪里?因为:

Foo.new.a、Foo.a 和 Class.a 不工作!

如果我在 Foo 类中使用 include 而不是 extend,方法“a”是为类 Foo 定义的(Foo.a 有效),我想:如果 include = Class 的“self”,extend = Metaclass 的“self” , 但没有。

可以解释方法“a”在哪里吗?

最佳答案

append_features是 ruby​​ 中的一个 Hook 方法,当您执行 include Bar 时,它会被调用。现在它将类方法 a 添加到类 Bar 中,然后它使类方法 a 可用于 Foo

让我来解释一下 a 方法是如何成为 Bar 的类方法的。当您执行 include Bar 时,将调用 hook 方法,并将其参数 klass 设置为 Bar。现在 klass.class_eval {..}class_eval 将 block {..} 内的 self 设置为 。现在 def self.a;puts 'a';end 实际上意味着 def Bar.a;puts 'a';end

module Bar
def self.append_features klass
klass.class_eval do
def self.a
puts 'a'
end
end
end
end

class Foo
include Bar
end

Foo.a # => a

Where is define "a" method? Because: Foo.new.a, Foo.a and Class.a don't works!

这是因为你做了extend Bar,没有调用钩子(Hook)方法append_features。所以类方法 a 没有像您预期的那样在类 Bar 中定义。

关于ruby - ruby 中的模块扩展和 class_eval,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20105153/

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