Может ли класс в модуле использовать атрибуты класса, который расширяет модуль?
Примером может быть:
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