修复"没有ID给出" method_missing中的消息

时间:2014-09-13 03:56:41

标签: ruby

以下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>'

1 个答案:

答案 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