2016-02-27 41 views
0

这两个表达式似乎没有区别。使用散列作为参数时,没有大括号的区别吗?

h = {a: 1, b: 2} 
h.merge({c: 3, d: 4}) 
h.merge(c: 3, d: 4) 

是否有问题的情况下,如果我使用Hash作为参数时省略了花括号?

+4

根本就没有,甚至更多:Rubocop/Ruby风格指南_suggest_在这种情况下忽略哈希值。 – mudasobwa

+4

要省略大括号,散列对必须是最后一个参数。例如,'def hi(a,b);放置“a =#{a},b =#{b}”;结束; hi(3,:a => 1,:b => 2)#=> a = 3,b = {:a => 1,:b => 2} hi(:a => 1,2)#=> SyntaxError:(irb):873:语法错误,意外...。 –

+4

在[Flanagan和Matsumoto的书]中有详细解释(https://books.google.ca/books?id=jcUbTcr5XWwC&pg=PA189&lpg=PA189&dq=ruby+argument+hash+omit+braces&source=bl&ots=fJFmwe7zgC&sig=m0A-lKxFrSD6_ryrwPwdQ1hfwOU&hl = EN&SA = X&VED = 0ahUKEwj1wem2rZfLAhUKcj4KHdIcBdAQ6AEILzAD#v = onepage&q =红宝石%20argument%20hash%20omit%20braces&F = FALSE)。有一件我没有想过的事情是,当你忽略参数的括号时,哈希的花括号*必须省略,以免Ruby将哈希看作一个块。 –

回答

4

不,这两个版本没有区别。

此外,当散列是方法的最后一个参数时,省略大括号是常见的Ruby/Rails惯用法。比较以下常见示例:

validates :foo, { presence: true } 
validates :foo, presence: true 

link_to "Foos", foo_path, { class: "foo" } 
link_to "Foos", foo_path, class: "foo" 
相关问题