我已经定义了一个工作方法,
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),也就是说它将整个参数视为一个参数。这是为什么?
答案 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)
错误。
或者,如果您可以更改相关方法的实现,则可以只接受一个哈希作为参数,并在方法内按键分隔值。