Синтаксис скобок для Ruby Hashes - PullRequest
3 голосов
/ 27 мая 2009

Передают ли эти два оператора один и тот же тип аргумента (хэш) новому методу?

@seat = Seat.new(:flight_id => @flight.id)

@seat = Seat.new({:flight_id => @flight.id})

Меняют ли скобки хэша {} что-нибудь во втором примере?

Ответы [ 2 ]

12 голосов
/ 27 мая 2009

Они оба одинаковы, {} ничего не добавляют во втором аргументе, кроме того, чтобы сделать вещи еще более явными, чем они были (достаточно использовать синтаксис =>, чтобы сказать «это хеш» любому, кто использует ruby на любой промежуток времени).

Ruby автоматически включит список параметров, таких как:

someFunction(:arg1 => value1, :arg2 => value2)

в хеш и передайте его в качестве единственного аргумента для вас. Время, когда вам нужно добавить {} вокруг хэшей, это когда у вас есть такие вещи, как хеш хэшей или функция, которая ожидает два хэша (например, несколько методов rails, когда вам нужно передать оба параметра и html_options), например:

someFunction({:arg1 => value1, :arg2 => value2}, {:arg3 => value3})

, который будет передаваться в двух хешах (интерпретатор не сможет определить, где 2 хеша были разделены, если он предоставлен самому себе, поэтому вам нужно дать ему {}, чтобы указать, что делать в этом случае)

Дополнительную информацию можно найти в главе книги «Кирка»: Подробнее о методах в разделе «Сбор аргументов хеша» внизу.

1 голос
/ 29 мая 2009

Это хорошее место для упоминания другого альтернативного синтаксиса, использующего запятую для разделения элементов в фигурных скобках (на вашем примере):

@seat = Seat.new({:flight_id, @flight.id})

Обычно я не использую синтаксис запятых в стандартном коде - как говорит workmad3, стрелка (=>) делает хэш более очевидным. Но в интерактивном сеансе Ruby (irb) запятую легче вводить, чем стрелку:

{:eyes, "blue", :height, 6.2}  # => {:height=>6.2, :eyes=>"blue"}

А в Ruby 1.9 идиоматическая версия имеет еще меньше запятых:

{eyes: "blue", height: 6.2}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...