我可以将哈希作为方法中的第一个参数吗?

时间:2017-02-19 11:16:17

标签: ruby

我正在学习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 {country:" Taiwan",city:" Tainan"}," Aaron"   (repl):15:语法错误,意外',',期待'}'把aaron.puts_result {country:" Taiwan",city:   " Tainan"}," Aaron"

我的粗心大意是什么?

1 个答案:

答案 0 :(得分:2)

第三次通话中出现错误

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

这里,解析开口大括号时存在语法歧义。它可以是哈希的开头(这是你想要的)或传递给方法的块的开头。

Ruby的解析器总是假定方法之后的左括号表示块的开始,除非您将参数放在显式括号中。这将解决歧义,因为块永远不会在括号内声明,但总是在外面。

使用您的代码,您可以解决模糊性,如下所示:

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

要从中获得可重复的规则:当第一个参数是带括号的文字散列时,请始终记住在方法调用周围使用paranthesis。