0

私は、cURL の Ruby ラッパーである Curb を使用しています。

method missing などのメソッドは、次のように定義されていれば、任意の数の引数とブロックを受け入れることができることを知っていることから始めたいと思います。

def method_missing(meth, *args, &block); ... end

*argsパラメータの配列です。

現在、Curb で次のようにして、HTTP GET、POST などのメソッドへの呼び出しをリファクタリングしようとしています。

req = Curl::Easy.send("http_#{method.to_s}", *args) do |curl| ... end

whereargsは、次のように定義しようとしている 1 つのパラメーターまたは 2 つのパラメーターのいずれかです。

args = [url]
args << data if data

しかし、Curl::Easy.send行を呼び出すとエラーが発生します。

both block arg and actual block given

(https://github.com/taf2/curb/blob/master/lib/curl/easy.rb) からアクセスしようとしているメソッドの例を次に示します。

      def http_get(*args)
        c = Curl::Easy.new *args
        yield c if block_given?
        c.http_get
        c
      end 

      def http_put(url, data)
        c = Curl::Easy.new url
        yield c if block_given?
        c.http_put data
        c
      end

      def http_post(*args)
        url = args.shift
        c = Curl::Easy.new url
        yield c if block_given?
        c.http_post *args
        c
      end

      def http_delete(*args)
        c = Curl::Easy.new *args
        yield c if block_given?
        c.http_delete
        c
      end

それらはすべて、put を除いて、任意の数の引数を取るように設定されています。しかし、実際にはhttp_get、URL を渡すだけで済みます (URL にクエリ パラメータを使用)。そのため、 には 1 つのパラメーターのみを渡し、他のパラメーターには 2 つのパラメーターを渡したいと思いhttp_getます。

4

1 に答える 1