gpt4 book ai didi

ruby - 在运行时继承一个新的类方法

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

在 ruby 中,<ClassName>.constants对检查类很有用:

> Numeric.constants(false)
=> [:KILOBYTE, :MEGABYTE, :GIGABYTE, :TERABYTE, :PETABYTE, :EXABYTE]
> Object.constants(false)
=> [:Object, :Module, ...]

这是在 Module 中定义的:

> Object.method(:constants)
=> #<Method: Class(Module)#constants>

我想添加另一种方法来打印包含所有常量及其值的散列。到目前为止的结果如下:

def Module.constants_hash(inherit=true)
self.constants(inherit).inject({}) do |hash, constant|
hash[constant] = self::const_get(constant)
hash
end
end

这适用于 Module (虽然它没有常量,所以结果只是一个空散列),但是它不是继承的:

> Object.constants_hash(false)
NoMethodError: undefined method `constants_hash' for Object:Class
from (pry):117:in `<main>'

我当然可以将代码中的类名更改为例如Object使调用工作,但是否也可以使所有依赖模块继承新方法?换句话说,是否可以在运行时添加一个方法,然后由类继承 require修改后的类?

我不想让原始的 Module.constants 重载, 以避免更改 API。

最佳答案

Object 是类型 Class 的实例。 Class 类继承自Module。为了使 Object.constants_hash 起作用,您需要定义 ClassModule 类的instance 方法:

class Module
def constants_hash(inherit=true)
self.constants(inherit).inject({}) do |hash, constant|
hash[constant] = self::const_get(constant)
hash
end
end
end

在您的代码中,您只需将 constants_hash 添加到 Module 实例(Class 类型)的单例类 ,这就是您得不到预期结果的原因。

关于ruby - 在运行时继承一个新的类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9099649/

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