将符号作为参数传递

Pass symbol as Arguments

我有一个已经定义好的工作方法,

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,Arguments 的错误数量(1 为 3),也就是说它将整个参数视为一个参数。这是为什么?

当您使用散列作为列表中的最后一个(或唯一的)方法参数时 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'} })

您实际上可以在您的第一个方法调用中看到这一点 - 第二个参数散列包含在它自己的花括号中,而最后一个则没有。如果您在第二个参数上省略了外花括号,Ruby 会将第二个和第三个参数解释为一个散列并给您一个 ArgumentError, wrong number of Arguments(2 for 3) 错误。

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