Ruby方法参数转换

Ruby方法参数转换,ruby,argument-passing,Ruby,Argument Passing,这是HTTPClient的源代码: def post(uri, *args, &block) request(:post, uri, argument_to_hash(args, :body, :header, :follow_redirect), &block) end 我做了如下包装: def post(uri, *args, &block) http.post(uri, args, &block) rescue Exception => e

这是HTTPClient的源代码:

def post(uri, *args, &block)
   request(:post, uri, argument_to_hash(args, :body, :header, :follow_redirect), &block)
end
我做了如下包装:

def post(uri, *args, &block)
  http.post(uri, args, &block)
rescue Exception => ex
  log_exception ex
end
并尝试传递参数:

httpclient.post 'url', xml_data, 'Content-Type' => 'application/xml'
my_proxy.post 'url', xml_data, 'Content-Type' => 'application/xml'
在第一种情况下,HTTPclient接收以下参数:

[
    "my xml text",
    {"Content-Type"=>"application/xml"}
]
在第二种情况下:

[
  [
    "my xml text",
    {"Content-Type"=>"application/xml"}
  ]
]
如何以正确的方式传递参数

def post(uri, *args, &block)
  http.post(uri, *args, &block)
  # ...
注意第二行中的星号(或者代码中没有星号)。这就是“splat”操作符,它在方法调用中将数组解压为单独的参数,并在方法定义中将参数打包为一个数组。在方法定义中打包参数(因此
args
是一个参数数组),然后将该数组传递给
post
,它不需要数组,而不需要解包。

我认为

def proxy(uri, *args, &block)
  http.post(uri, *args, &block)
  # ...
应该做到这一点,本质上是“取消网格化”(
*
是splat操作符)args数组