我认为我的问题最好通过此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
的情况下如何返回某些内容?
答案 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