gpt4 book ai didi

ruby - 在 ruby​​ 模块中添加特定于类的功能

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

可能我没有很好地解释这个概念,但我希望将类方法添加到一系列 ruby​​ 类中,使它们能够保存特定于类的信息,然后这些信息将由类的各个实例方法调用。

我可以让它工作,但它有点难看。任何人都可以,因为它需要 2 个模块,一个包含,另一个扩展(参见下面的示例代码)。

谁能想到一种更优雅的方式来实现此功能?

谢谢

史蒂夫

这个模块被扩展为提供类方法,但是为它包含的每个类添加了一个实例成员

module My1
def my_methods (*sym_array)
@my_methods=sym_array
end

def method_list
@my_methods
end
end

包含这个模块是为了提供实例方法

module My2
def foo
self.class.method_list.each { |m| self.send m }
end
end

现在使用模块 - 丑陋之处在于必须使用 include 和 extend 语句来允许我将一组符号传递给类方法,然后在类方法中实现实例

class Foo
extend My1
include My2

my_methods :baz

def baz
puts "Baz!"
end
end

class Bar
extend My1
include My2

my_methods :frodo

def frodo
puts "Frodo!"
end

end

class Wibble < Bar
extend My1
include My2

my_methods :wobble

def wobble
puts "Wobble!"
end
end

这是所需的输出 - 请注意,每个类都有自己的实例 @my_methods,因此派生类 Wibble 的行为是不同的

f=Foo.new
b=Bar.new
w=Wibble.new

f.foo #=> "Bar!"
b.foo #=> "Frodo!"
w.foo #=> "Wobble!"

最佳答案

当一个模块被包含时,一个钩子(Hook)被调用。您可以使用它来进行所需的扩展。

module M1
def self.included(base)
base.extend(M2)
end
end

人们通常称第二个模块为 M1::ClassMethods。如果您使用的是 Rails,ActiveSupport::Concern 封装了这种模式

关于ruby - 在 ruby​​ 模块中添加特定于类的功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8922635/

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