gpt4 book ai didi

Ruby 模块包含,无法访问包含的方法,只能访问常量

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

我有这样的模块结构:

module Parent

PARENT_CONST = 'parent const'

def Parent.meth
puts 'parent meth'
end

end

module Child
include Parent
end

这按预期工作:

puts Parent::PARENT_CONST
=> parent const
Parent.meth
=> parent meth

我可以从子项访问父项的常量,但不能访问方法。像这样:

Child::PARENT_CONST
=> parent const
Child.meth
=> in `<main>': undefined method `meth' for Child:Module (NoMethodError)

我有办法做到这一点吗?

最佳答案

下面是一种常见的将一个包含常量、实例方法和类方法的模块混合到一个类中的方法,但也可以用来将一个模块的常量和类方法包含在另一个模块中,这就是你想要的去做。它使用“回调”或“ Hook ”方法Module#included . Object#extend添加模块中的实例方法,该模块是 extend 的接收者模块的参数。下面它生成了 Child 模块中的 Public::C_Meths 类方法中的实例方法(这里只有一个)。

module Parent
module I_Meths
PARENT_CONST = 'parent const'
end

module C_Meths
def cmeth
'cmeth'
end
end

def self.included(mod)
mod.include(I_Meths)
mod.extend(C_Meths)
end
end

module Child
include Parent
end

Child::PARENT_CONST
#=> "parent const"
Child.cmeth
#=> "cmeth"

更常见的是使用此构造将包含约束、实例方法和类方法的模块混合到一个类中。

假设我们要添加实例方法:

def imeth
'imeth'
end

到模块 Parent::I_Methsinclude Parent 在一个类中:

class A
include Parent
end

然后

A::PARENT_CONST
#=> "parent const"
A.cmeth
#=> "cmeth"
A.new.imeth
#=> "imeth"

关于Ruby 模块包含,无法访问包含的方法,只能访问常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29189062/

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