gpt4 book ai didi

带有来自包含类的静态方法调用的 Ruby 模块

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

我需要在使用包含该模块的类中的方法的模块中定义常量:

module B 
def self.included(base)
class << base
CONST = self.find
end
end
end

class A
def self.find
"AAA"
end
include B
end

puts A::CONST

但是编译器在第 4 行给出了错误。

还有其他方法可以定义常量吗?

最佳答案

在 Ruby 中实现这一点的更惯用的方法是:

module B 
def self.included(klass)
klass.class_eval <<-ruby_eval
CONST = find
ruby_eval

# note that the block form of class_eval won't work
# because you can't assign a constant inside a method
end
end

class A
def self.find
"AAA"
end
include B
end

puts A::CONST

你在做什么(class << base)实际上将你置于 A 的 metaclass 的上下文中,而不是 A 本身。 find 方法在 A 本身上,而不是在它的元类上。要记住的是,类本身就是对象,因此有自己的元类。

为了让它更清晰:

class Human
def parent
# this method is on the Human class and available
# to all instances of Human.
end

class << self
def build
# this method is on the Human metaclass, and
# available to its instance, Human itself.
end

# the "self" here is Human's metaclass, so build
# cannot be called.
end

def self.build
# exactly the same as the above
end

build # the "self" here is Human itself, so build can
# be called
end

不确定这是否有帮助,但如果您不理解,您仍然可以使用上面的 class_eval 习语。

关于带有来自包含类的静态方法调用的 Ruby 模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1050354/

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