将符号作为参数传递

时间:2015-06-04 04:02:05

标签: ruby-on-rails arguments symbols

我已经定义了一个工作方法,

render_format(doc,host,table_info)

我在某个位置调用了这个方法,其中我将参数传递为

render_format("Daily Transactions in POS", {:doc => xml,:schema_name => "#{schema_name}",:store_code => "#{store_code}"}, :sales_log => "#{sales_log}")

这很好用。

现在我必须将此方法称为

render_format(:doc => xml,:host => "bhindi.rw:3000",:table_info => {'hdr' => 'pos_invoices', 'line' => 'pos_invoice_lines', 'id' => 'pos_invoice_id', 'check_image_flag' => 'Y'})

但这会产生ArgumentError,错误的参数数量(1表示3),也就是说它将整个参数视为一个参数。这是为什么?

1 个答案:

答案 0 :(得分:1)

当您使用散列作为列表中的最后一个(或唯一)方法参数时,Ruby允许您省略大括号。在第一次调用时,参数具有不同的类型(字符串和散列),因此Ruby理解这些是几个参数。但是在第二次调用中,每个参数都是一个只有一个键值对的哈希,但由于可选的外部花括号,Ruby会将其解释为一个哈希值,从而为您提供ArgumentError。

你可以将每个哈希包装在自己的花括号中,让Ruby知道它们实际上是单独的哈希值:

render_format({ :doc => xml }, { :host => "bhindi.rw:3000" }, { :table_info => {'hdr' => 'pos_invoices', 'line' => 'pos_invoice_lines', 'id' => 'pos_invoice_id', 'check_image_flag' => 'Y'} })

你可以在第一个方法调用中实际看到这个 - 第二个参数hash包装在它自己的花括号中,而最后一个不是。如果在第二个参数上省略了外部花括号,Ruby会将第二个和第三个参数解释为一个哈希并给出ArgumentError, wrong number of Arguments(2 for 3)错误。

或者,如果您可以更改相关方法的实现,则可以只接受一个哈希作为参数,并在方法内按键分隔值。