Опущение фигурных скобок для хеша в массиве - PullRequest
7 голосов
/ 17 февраля 2012

Я понял, что фигурные скобки для хэша могут быть опущены, если это последний элемент в массиве. Например, формы:

[1, 2, 3, :a => 'A', :b => 'B']
[1, 2, 3, a: 'A', b: 'B']

кажется идентичным:

[1, 2, 3, {:a => 'A', :b => 'B'}]
[1, 2, 3, {a: 'A', b: 'B'}]

Я знал, что такого рода упущение возможно для аргументов метода, но не заметил, что это возможно для массива. Правильно ли мое понимание этого правила? И это где-то описано?

Ответы [ 2 ]

4 голосов
/ 10 марта 2012

Казалось бы, новая функция 1.9:

$ rvm use 1.8.7
$ irb
ruby-1.8.7-p352 :001 > x = [ 1,2,3,:a => 4, :b => 5 ]
SyntaxError: compile error
(irb):1: syntax error, unexpected tASSOC, expecting ']'
x = [ 1,2,3,:a => 4, :b => 5 ]
                 ^
  from (irb):1
ruby-1.8.7-p352 :002 > exit
$ rvm use 1.9.3
$ irb
ruby-1.9.3-p0 :001 > x = [ 1,2,3,:a => 4, :b => 5 ]
 => [1, 2, 3, {:a=>4, :b=>5}] 
ruby-1.9.3-p0 :002 >
0 голосов
/ 17 февраля 2012

Я думаю, что квадратные скобки (и без скобок, как показано ниже) называются хеш-литералами, а ruby ​​просто пытается разместить его как элемент массива.

>> [1, 2, c: 'd', e: 'f'] # ruby 1.9 hash literals
=> [1, 2, {:c=>"d", :e=>"f"}]

Но я думаю, что здесь больше нет правил - вы не можете сделать это:

>> [1, 2, c: 'd', e: 'f', 5] # syntax error, unexpected `]` (waiting for => or :)
...