2015-06-04 78 views
3

我有一個已定義和工作方法,通行證符號作爲參數

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

當您使用散列作爲列表中最後(或唯一)的方法參數時,Ruby允許您省略大括號。在你的第一次調用中,參數是不同類型的(字符串和散列),所以Ruby知道這些是幾個參數。但在第二次調用中,每個參數都是隻有一個鍵值對的哈希,但由於可選的外部大括號,Ruby將它解釋爲一個哈希,因此會給出ArgumentError。

您可以在自己的花括號讓紅寶石知道,他們實際上是獨立的分開哈希包裝每個哈希:

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)錯誤。

或者,如果您可以更改相關方法的實現,則可以接受一個散列作爲參數,並通過方法內的鍵分隔值。

+0

感謝您的詳細解釋:) – Niyanta