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

标签 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: syntax error, unexpected ':', expecting '}' puts aaron.puts_result {country: "Taiwan", city: "Tainan"}, "Aaron" (repl):15: syntax error, unexpected ',', expecting '}' puts aaron.puts_result {country: "Taiwan", city: "Tainan"}, "Aaron"

是不是我粗心了?

最佳答案

第三次调用时出现错误

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

此处,在解析左花括号时存在语法歧义。它可以是哈希的开始(这是您想要的),也可以是传递给方法的 block 的开始。

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

使用您的代码,您可以按如下方式解决歧义:

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

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

关于ruby - 我可以将哈希作为方法中的第一个参数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42326556/

相关文章:

ruby - 在 Ubuntu 上使用 Ruby,我如何检查默认浏览器是什么?

ruby - 使用 Watir 控制新选项卡运行? ( ruby )

ruby - 如何强制 Ruby 的 CSV 输出中的一个字段用双引号引起来?

ruby-on-rails - 没有响应我的链接的操作

mysql - 如何解析 activerecord 查询以生成集合?

javascript - 您可以将 javascript 注入(inject) ERB 文件吗?

ruby-on-rails - Mongoid 标签 - 从模型中收集独特的数组项

ruby - 在 Ruby 中使用关键字参数柯里化(Currying) proc

ruby - json_pure/rubygems 循环依赖

jquery - 为什么路由找不到小数点