さて、このパズルのステップ 2 を解こうとしていたのですが、問題が発生しています。私の問題は、インスタンス変数にアクセスしようとし(@name)
たり、クラスのメソッドを呼び出したりしようとしたとき(name getter)
です.rubyは、未定義のローカル変数を教えてくれます. 私には、これは範囲の問題のように思えます。アクション名とブロックがパラメーターとして与えられたときに問題が発生します。私が信じているインスタンス変数にシングルトンが正常に追加されていますが、それを呼び出すと、「名前」が未定義のローカル変数であることがRubyに通知されます。何か案は?他の方法でより効率的に機能をエミュレートする方法はありますか?
ここに私のDog.rbクラスがあります:
class Dog
MSGS = {:dance => 'is dancing', :poo => 'is a smelly doggy!', :laugh => 'finds this hilarious!'}
attr_accessor :name
def initialize(name)
@name = name
end
def can(*actions)
actions.each do |action|
self.instance_eval do
if block_given?
define_singleton_method action do
yield
end
else
define_singleton_method(action) do
name + ' ' + MSGS[action]
end
end
end
end
end
def method_missing(method_name,*args)
name + " can't " + method_name.to_s
end
end
パズルの Dog_Game.rb は次のとおりです。
require './dog'
lassie, fido, stimpy = %w[Lassie Fido Stimpy].collect{|name| Dog.new(name)}
lassie.can :dance, :poo, :laugh
fido.can(:poo){"#{name} is just wayyyy too smelly."} #name here is the source of the problem
stimpy.can :dance
stimpy.can(:cry){"#{name} cried AHHHH"}
p lassie.dance
p lassie.poo
p lassie.laugh
puts
p fido.dance
p fido.poo
p fido.laugh
puts
p stimpy.dance
p stimpy.poo
p stimpy.laugh
p stimpy.cry