2017-02-19 79 views
3

我在學Ruby,遇到一個問題。我可以把散列作爲方法中的第一個參數嗎?

這是我寫的代碼。

class Customer 
    def puts_result(name, addr) 
    return name, addr 
    end 
end 

aaron = Customer.new 
puts aaron.puts_result "Aaron", {country: "Taiwan", city: "Tainan"} 
puts aaron.puts_result "Aaron", country: "Taiwan", city: "Tainan" 
puts aaron.puts_result {country: "Taiwan", city: "Tainan"}, "Aaron" 

我調用puts_result方法並通過三種不同的方式傳遞參數。

在第一種方法中,我通過了大括號的散列,它工作正常。 在第二種方式中,我通過了沒有大括號的哈希,它仍然被罰款。

我的問題是在第三種方式,我通過哈希作爲第一個參數與花括號,但它會返回一個錯誤。

(REPL):15:語法錯誤,意想不到的 ':',期待 '}' 把 aaron.puts_result {國家: 「臺灣」,城市 「臺南」}, 「阿龍」 (REPL) :15:語法錯誤,意外 '' 期待 '}' 把aaron.puts_result {國家: 「臺灣」,城市: 「臺南」}, 「阿龍」

是不是有什麼我的疏忽?

回答

2

錯誤occures在你的第三個電話

puts aaron.puts_result {country: "Taiwan", city: "Tainan"}, "Aaron" 

在這裏,有分析的大括號,當一個語法歧義。它可以是哈希的開始(這是你的意圖),也可以是傳遞給方法的塊的開始。

Ruby的解析器總是假定在方法發出信號指示塊開始之後的大括號,除非將參數放在明確的括號中。這樣就可以解決歧義問題,因爲塊永遠不會在括號內聲明,而總是在外部聲明。

與您的代碼,你可以這樣解決多義如下:

puts aaron.puts_result({country: "Taiwan", city: "Tainan"}, "Aaron") 

要想從本可重複的規則:永遠記住使用paranthesis各地方法調用時,第一個參數是一個文字哈希用大括號。

+1

我明白了!非常感謝您的解釋。 – PJCHENder

相關問題