标题类型很糟糕,所以请改为使用此代码:
module MyModule
def foo
puts "Foo!"
super if defined?(super)
end
end
class MyClass
include MyModule
end
class MySubclass < MyClass
include MyModule
end
如果我打电话给以下,&#34; Foo!&#34;打印一次。
MySubclass.new.foo
# Foo!
# => nil
我希望打印两次,首先调用MySubclass
,然后通过MyClass
调用super
一秒。
MySubclass
祖先看起来像:
[MySubclass, MyClass, MyModule, Object, Kernel, BasicObject]
我可能误解了Ruby如何分类,方法祖先,所以如果不是这样做的话,还有另一种聪明的方法可以实现吗?
编辑:好的,听起来我需要提供一个更有用的用例。我们假设模块执行类似ActiveRecord或Mongoid的声明属性。
module MyModule
def self.included(base)
base.extend(ClassMethods)
end
module ClassMethods
attr_reader :fields
def field(name)
(@fields ||= []) << name.to_sym
end
end
end
然后使用它在类和子类上声明一个字段:
class MyClass
include MyModule
field(:a)
end
class MySubclass < MyClass
include MyModule
field(:b)
end
如果您调用MySubclass.fields
,我不希望它返回[:b]
我希望通过调用[:a, :b]
来返回fields
它的父类,并将其自身连接到结果上。
答案 0 :(得分:2)
因为这些是类方法,所以你可以通过这样做来对这个问题进行最后的考虑{/ 1}}:
super