2016-02-27 1 views
0

Кажется, нет никакой разницы между этими двумя выражениями.Есть ли разница без фигурных скобок при использовании хэша в качестве аргумента?

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

Есть проблемный случай, если я опустить фигурные скобки при использовании Hash в качестве аргумента?

+4

Вовсе нет, даже больше: принципы стиля Rubocop/Руби _suggest_ опустить Curlies вокруг хэша в таком случае. – mudasobwa

+4

Чтобы опустить фигурные скобки, хэш-пары должны быть последними из аргументов. Например, 'def hi (a, b); puts "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

Это хорошо объяснено в книге Фланагана и Мацумото (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 = & ный са = Х & веды = 0ahUKEwj1wem2rZfLAhUKcj4KHdIcBdAQ6AEILzAD # v = OnePage & д = рубиновый% 20argument% 20hash% 20omit% 20braces & F = ложь). Одна вещь, о которой я не думал, заключается в том, что когда вы опускаете круглые скобки вокруг аргументов, фигурные скобки хеша * должны * быть опущены, чтобы 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"