Ruby方法参数转换

时间:2014-09-16 06:52:43

标签: 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 => 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收到以下args:

[
    "my xml text",
    {"Content-Type"=>"application/xml"}
]

在第二种情况下:

[
  [
    "my xml text",
    {"Content-Type"=>"application/xml"}
  ]
]

如何以正确的方式传递参数?

2 个答案:

答案 0 :(得分:1)

def post(uri, *args, &block)
  http.post(uri, *args, &block)
  # ...

请注意第二行中的星号(或代码中没有星号)。那是" splat" operator,在方法调用中将数组解包为单独的参数,并在方法定义中将参数打包到一个数组中。你在方法定义中打包参数(所以你的args是一个参数数组),但是在没有解压缩的情况下将该数组传递给post,它不需要数组。

答案 1 :(得分:0)

我认为

def proxy(uri, *args, &block)
  http.post(uri, *args, &block)
  # ...

应该做的伎俩,基本上是#34; unsplatting" (*是splat运算符)args-array。