Может ли класс в модуле использовать атрибуты класса, который расширяет модуль?

Примером может быть:

module SharedStuff
  def has_foo
    !@foo.nil?
  end

  class StuffGenerator
    def initialize
      # super can't work here
    end

    # Will return nil.
    def try_foo
      @foo
    end
  end 
end


class NeedsSharedStuff < BaseSource
  include SharedStuff
  def initialize
    super
  end
end

class AlsoSharedStuff < OtherSource
  include SharedStuff
  def initialize
    super
  end
end

class BaseSource
  attr_reader :foo, :bar
  def initalize
    @foo, @bar = get_foo, get_bar
  end
end

class OtherSource < BaseSource
  def initialize
    super
  end

  def extra_stuff
    # whatever...
  end
end

Я потерял свой @foo а также @bar атрибуты во вложенных классах в SharedStuff, Есть ли способ получить его, не прибегая к этому?

module SharedStuff
  def has_foo
    @foo.empty?
  end

  def stuff_generator
    StuffGenerator.new @foo, @bar
  end

  class StuffGenerator
    attr_reader :foo, :bar
    def initialize(foo, bar)
      @foo, @bar = foo, bar
    end

    def try_foo
      @foo
    end
  end 
end

Я знаю, что это неправильно, потому что я до сих пор не могу достичь has_foo в родительском модуле. Я новичок в использовании миксинов и модулей в Ruby, есть ли способ организовать это, чтобы получить методы в SharedStuff и методы экземпляров классов, которые расширяют его внутри StuffGenerator?

1 ответ

Вы все еще можете наследовать внутри модулей. Все, что мне было нужно, это @foo а также @bar атрибуты, поэтому я просто пошел в BaseSource и получил их. :D,

module SharedStuff
  def has_foo
    !@foo.nil?
  end

  class StuffGenerator < BaseSource
    def initialize
      super
    end

    # Will return foo.
    def try_foo
      @foo
    end
  end 
end
Другие вопросы по тегам