看起来Object#方法和Object#方法之间存在不一致

时间:2013-02-13 07:29:33

标签: ruby sinatra

我认为我的问题最好通过此irb会话捕获:

irb(main):001:0> require 'sinatra'
=> true
irb(main):002:0> method(:get)
=> #<Method: Object(Sinatra::Delegator)#get>
irb(main):003:0> methods.include?(:get)
=> false
irb(main):004:0> wtf?
NoMethodError: undefined method `wtf?' for main:Object
        from (irb):4
        from C:/Ruby193/bin/irb:12:in `<main>'
irb(main):005:0>

我的问题,实际上是一个红宝石,而不是一个特定于sinatra的问题,是method(:get)methods在其返回的数组中不包括:get的情况下如何返回某些内容?

1 个答案:

答案 0 :(得分:3)

确定。这有点令人头疼,但最后答案可以在documentation of methods中找到,其中说:

  

返回obj的 public和protected 方法的名称列表。这将包括obj的祖先可访问的所有方法。

然后你将它与Sinatra来源结合起来:

module Delegator
  def self.delegate(*methods)
    methods.each do |method_name|
      define_method(method_name) do |*args, &block|
        ...
      end
      private method_name    # <- here
    end
  end

  delegate :get, :patch, :put, :post, :delete, :head, :options, ... 
end

我们可以看到问题所在。然后解决方案变为:

private_methods.include?(:get)
=> true