2015-11-25 3 views
3

ВОПРОС РЕДАКТИРОВАНИЯ - Разбивка, как второй пример создает хэш.Создание массива, содержащего хэш

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

a: :b 
# => SyntaxError: (irb):1: syntax error, unexpected ':', expecting end-of-input 

против

[a: :b] 
# => [{:a => :b}] 
+0

Синтаксис хэша без компиляции (то, что вы пытаетесь использовать) работает только при определенных обстоятельствах. – Linuxios

+0

Поскольку синтаксический сахар Ruby для немедленных хэшей не применим ко всем возможным конструкциям Ruby. –

+0

@DaveNewton у вас есть ссылка на документацию, которая показывает цепочку того, как это обрабатывается? PS. Спасибо за редактирование – omgmakeme

ответ

4

Когда вы просто a: :b, что это утверждение и является недействительным синтаксис Руби.

Если у вас есть [a: :b], вы на самом деле вызываете метод. Метод, который вы вызываете, - [](a: :b). Когда вы даете a: :b как аргумент метода Ruby видит его как хэш и дает метод {:a => :b} как аргумент. Таким образом, конечный результат - [{:a => :b}], который вы видите.

+0

Метод [] (a:: b) теперь имеет смысл теперь, прочитав документацию Array, я не знал [a:: b] == [] (a:: b), но после вашего объяснения это имеет смысл , Теперь, почему рубин увидит это как хэш, это другое дело, но вы прояснили этот метод для меня. Спасибо – omgmakeme

+0

Отлично! Я также верю, что 'a:: b' или' 'c' => 'd'' интерпретируется как хэш *, только если * это аргумент метода. (Это не может быть, например, приемником.) Это правда, что было бы очень желанным, так как оно точно сообщило бы нам о том, где форма без брекетов не может и не может быть использована. –

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