私は、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
ます。