2, "yen"=>6} def metho-6ren">
gpt4 book ai didi

ruby- method_missing 返回无方法错误

转载 作者:数据小太阳 更新时间:2023-10-29 07:52:42 25 4
gpt4 key购买 nike

我正在尝试使用 method_missing 将美元转换为不同的货币。

class Numeric
@@currency={"euro"=>2, "yen"=>6}
def method_missing(method_id,*args,&block)
method_id.to_s.gsub!(/s$/,'') #get rid of s in order to handle "euros"
@@currency.has_key?(method_id) ? self*@@currency[method_id] : super
end
end

> 3.euro #expect to return 6
NoMethodError: undefined method 'euro' for 3:Fixnum
from (pry):24:in 'method_missing'

> 3.euros #expect to return 6
NoMethodError: undefined method 'euros' for 3:Fixnum
from (pry):24:in 'method_missing'

我猜 3.euro 不工作是因为 :euro.to_s.gsub!(/s$/,'') 返回 nil。我不确定为什么它不返回任何方法错误。

感谢您的帮助。

最佳答案

当调用method_missing 时,euro 将作为符号 分配给method_id。但是您的@@currency 哈希将所有键都作为字符串保存,您需要将它们转换为符号

method_id.to_s.gsub!(/s$/,'') 没有办法改变实际对象method_id。因为 method_id.to_s 会给你一个新的 string 对象,而 #gsub! 只会处理这个。您绝不会更改 method_id,它会保持原样。最好使用 non-bang 一个,因为如果没有进行任何更改,它将为您提供实际对象,或者如果进行了更改,则更改对象将为您提供实际对象,然后您需要将此返回值分配给一个新变量。

用你的@@currency@@currency.has_key?(method_id)被评估为falsesupermethod_missing 已被调用。为什么?由于 method_id 没有转换成字符串,这可能会发生。

但是,如果您想同时响应 euroeuros,那么

class Numeric
@@currency={"euro" => 2, "yen" => 6}
def method_missing(method_id,*args,&block)
#get rid of s in order to handle "euros"
new_method_id = method_id.to_s.gsub(/s$/,'')
@@currency.has_key?(new_method_id) ? self*@@currency[new_method_id] : super
end
end

3.euros # => 6
3.euro # => 6

关于ruby- method_missing 返回无方法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23977038/

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