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>

私の質問は、実際にはルビーであり、シナトラ固有の質問ではありませんが、返された配列に 含まれていないときに、どのmethod(:get)ようにして何かを返すことができますか?methods:get

4

1 に答える 1

3

Ok。これには少し頭を悩ませる必要がありましたが、最終的には、のドキュメントにmethods答えがあります。

objのパブリックメソッドとプロテクトメソッドの名前のリストを返します。これには、objの祖先でアクセス可能なすべてのメソッドが含まれます。

そして、それをシナトラのソースと組み合わせます。

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 に答える