1

我认为这个 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

4

1 回答 1

3

好的。这有点让人头疼,但最终答案可以在 的文档中methods找到,其中说:

返回obj的公共和受保护方法的名称列表。这将包括 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
于 2013-02-13T08:56:23.547 回答