以下Ruby代码引发了最后显示的混乱错误“no id given”。我该如何避免这个问题?
class Asset; end
class Proxy < Asset
def initialize(asset)
@asset
end
def method_missing(property,*args)
property = property.to_s
property.sub!(/=$/,'') if property.end_with?('=')
if @asset.respond_to?(property)
# irrelevant code here
else
super
end
end
end
Proxy.new(42).foobar
#=> /Users/phrogz/test.rb:13:in `method_missing': no id given (ArgumentError)
#=> from /Users/phrogz/test.rb:13:in `method_missing'
#=> from /Users/phrogz/test.rb:19:in `<main>'
答案 0 :(得分:3)
这个问题的核心可以用这个简单的测试来显示:
def method_missing(a,*b)
a = 17
super
end
foobar #=> `method_missing': no id given (ArgumentError)
在将第一个参数的值更改为符号以外的值后,在super
内调用method_missing
时会出现此错误。修复?不要那样做。例如,原始问题的方法可以改写为:
def method_missing(property,*args)
name = property.to_s
name.sub!(/=$/,'') if name.end_with?('=')
if @asset.respond_to?(name)
# irrelevant code here
else
super
end
end
或者,请务必明确将符号作为第一个参数传递给super
:
def method_missing(property,*args)
property = property.to_s
# ...
if @asset.respond_to?(property)
# ...
else
super( property.to_sym, *args )
end
end