2014-10-30 2 views
0

При изучении рельсов меня часто путают, когда в некоторых сценариях двоеточие помещается перед словом, а в других случаях оно помещается после слова. Я читал и перечитывал, чтобы попытаться понять это лучше и до сих пор определил, что, когда двоеточие помещается перед словом, это символ.Использование символов в качестве хеш-ключей

Я думал, что понял это, пока не прочитал «Agile Web Development with Rails 4 (Facets of Ruby), page 56».

Я правильно понимаю, что символ имеет двоеточие перед его именем, даже когда он используется в качестве ключа в хэше, однако существует альтернативный синтаксис, который помещает двоеточие после имени символа в хэш?

+0

Обратите внимание, что JavaScript-трейлинг-стиль двоеточия не всегда работает, даже если вы используете символы в качестве ключей хэша. '{: $ set => {...}}', например, является допустимым, но '{$ set: {...}}' является синтаксической ошибкой. –

+1

Возможно, вас заинтересует [** Исключено ли Hash Rocket? **] (http://stackoverflow.com/q/10004158/479863), [** Как создать символ (хеш-ключ) из ассоциации, используя новый рубин (1.9) хэш-синтаксис? **] (http://stackoverflow.com/q/8796358/479863) и [** Поддержка синтаксиса хэша Ruby 1.9 в Ruby 1.8 **] (http://stackoverflow.com/q/9694209/479863). И проверьте разделы * Related * в боковых панелях по этим вопросам для более подробного обсуждения этой запутанной функции Ruby. –

ответ

1

Это правильно. Символ всегда определяются с двоеточием перед именем

:foo 

Оригинального обозначение для Hash с ключами символа было

{ :foo => "bar" } 

Однако, так как Ruby 1.9, существует альтернативное обозначение, которая была разработана, чтобы быть более компактным.

{ foo: "bar" } 

Эти две записи эквивалентны. Однако это конкретное исключение Hash. Ниже не является допустимым символом декларация о работе его на

foo: 
+1

Спасибо за ответы. То, что я не могу понять, это то, что оригинальная нотация была: {: foo => "bar"} и было желание сократить ее, почему бы не сделать это: {: foo "bar"} Так что, по сути, когда я см. двоеточие перед словом, которое я знаю, это символ, и когда я вижу двоеточие после слова, которое я знаю, это все еще символ, а просто используется в хеше, используя компактный формат. то есть Model.where (: foo => 'bar'). update_all (автор: 'David') – Dercni

+0

Две записи не эквивалентны, поскольку символы, разрешенные с помощью стиля JavaScript, более ограничены, чем символы, разрешенные с помощью хэш-дро. –

+0

Думал, что это было до тех пор, пока я не прочитал следующее в примере миграции: t.decimal: price, precision: 8, scale: 2 Так что цена, точность и масштаб - все символы, а в последних двух используются компактные обозначения внутри хеша ??? – Dercni

1

Да, если вы запустите консоль Rails, а затем запустить:

{ test: "ds"}.keys[0] == :test 

Вы увидите, что она возвращает истинное

Смежные вопросы