Я изучаю реализацию adapter pattern в рубине. Я хочу получить доступ к переменной экземпляра в определении модуля адаптера. Взгляните на следующий код:Шаблон адаптера в рубине: доступ к вашим переменным экземпляра
module Adapter
module Dog
def self.speak
# I want to access the #name instance variable from my Animal instance
puts "#{name} says: woof!"
end
end
module Cat
def self.speak
# I want to access the #name instance variable from my Animal instance
puts "#{name} says: meow!"
end
end
end
class Animal
attr_accessor :name
def initialize(name)
@name = name
end
def speak
self.adapter.speak
end
def adapter
return @adapter if @adapter
self.adapter = :dog
@adapter
end
def adapter=(adapter)
@adapter = Adapter.const_get(adapter.to_s.capitalize)
end
end
Чтобы проверить это, я сделал следующее:
animal = Animal.new("catdog")
animal.adapter = :cat
animal.speak
Я хочу, чтобы вернуться в следующем:
catdog says: meow!
Вместо этого он говорит:
Adapter::Cat says: meow!
Любые советы о том, как я c получить доступ к методу экземпляра Animal#name
из модуля адаптера? Я думаю, проблема заключается в том, что мои методы-адаптеры являются методами класса.
Спасибо!
Возможно, вы захотите '@adapter || =: dog', поскольку это часто более кратким, но не забывайте, что возврат': dog.speak' не будет работать. – tadman