红宝石的继承与延伸

Jai*_*ung 2 ruby ruby-on-rails

我一直在玩ruby,对我的继承和mixin有一点了解.请考虑以下代码:

module Base
  class Parent
    def foo
      "hello parent"
    end
  end

  module Extension
    module Extender
      def bar
        "hello extended"
      end
    end
  end
  module Tasks
    class Child < Base::Parent
      extend Base::Extension::Extender
      def blah
        puts "blah"
        puts foo
        puts self.bar
      end
    end
  end
end

Base::Tasks::Child.new().blah
Run Code Online (Sandbox Code Playgroud)

blah在'bar'失败,声称它未定义.这样做的上下文是我想使用Parent中的方法,但是也可以从Extender中提取一些可能在Parent中使用的选项和/或配置.有了这个设置,我希望bar可以作为一个类变量被引入Child,但很明显,它不是.

是否有更好的方法来组织这个,或者我误解了扩展如何工作?

mea*_*gar 5

你需要include创建bar一个实例方法,而不是extend.有了extend,你已经制作bar了一个类级方法; 你必须通过它访问它Child.bar.

所以这些之一:

class Child < Base::Parent
  extend Base::Extension::Extender
  def blah
    puts Child.bar
Run Code Online (Sandbox Code Playgroud)

要么

class Child < Base::Parent
  include Base::Extension::Extender
  def blah
    puts self.bar
Run Code Online (Sandbox Code Playgroud)