gpt4 book ai didi

ruby - 添加单例方法和访问实例变量 - 未定义

转载 作者:行者123 更新时间:2023-12-05 05:28:07 25 4
gpt4 key购买 nike

好吧,我正在尝试 solve step 2 in this puzzle我遇到了麻烦。我的问题是在尝试访问实例变量 (@name) 或什至调用类 (name getter) 上的方法时,ruby 告诉我未定义的局部变量。对我来说,这似乎是一个范围问题。当一个 Action 名称和一个 block 作为参数给出时,问题就出现了。我相信单例已成功添加到实例变量中,但调用它时,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

最佳答案

1: 你创建了一个丑陋的方法:

self.instance_eval {} == define_singleton_method(callback, &block)

你应该使用一个而不是两个!

2:因为当你使用

时范围发生了变化
self.instance_eval do 
#coding
end

你不能使用变量 :name,所以只使用 define_singleton_method!

对不起,我的英语很差!

关于ruby - 添加单例方法和访问实例变量 - 未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14077673/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com