从继承类调用模块定义方法中的super

时间:2016-05-20 21:28:26

标签: ruby

标题类型很糟糕,所以请改为使用此代码:

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它的父类,并将其自身连接到结果上。

1 个答案:

答案 0 :(得分:2)

因为这些是类方法,所以你可以通过这样做来对这个问题进行最后的考虑{/ 1}}:

super