Ошибка синтаксиса Ruby при попытке поставить буквальный хеш - PullRequest
0 голосов
/ 10 мая 2018

Может ли кто-нибудь объяснить мне, почему в консоли ruby ​​(версия 2.3.4) пытается распечатать хэши эти работы:

puts({a: 'a', b: 'b'})
puts(a: 'a', b: 'b')
puts a: 'a', b: 'b'
puts [a: 'a', b: 'b']  <<< array length 1 with value of hash
puts Hash[a: 'a', b: 'b']

, но ни одна из этих работ:

puts {a: 'a', b: 'b'}
puts {:a => 'a', :b => 'b'}
puts{:a => 'a', :b => 'b'}

даетошибка:

синтаксическая ошибка, неожиданный ',', ожидание '}'

ставит {a: 'a', b: 'b'}

__ _ _ _ _ ^

И эти:

 puts {:a => 'a'}
 puts {a: 'a'}
 puts{a: 'a'}

также ошибка с:

синтаксическая ошибка, неожиданная =>, ожидающая '}'

ставит {: a =>' a '}

_ _ _ _ _ ^

Насколько я понимаю (), функции были полностью необязательными ив соответствии со стилевыми предпочтениями разработчика.

И то, что {} вокруг хэшей было в основном необязательным, но никогда не требовалось НЕ использовать.

Я мог бы понять, если интерпретатор был перепутан между 1 или 2 хэшами(так как для put требуется более 1 аргумента), но он просто умирает.

Что еще хуже: это работает:

 puts({a: 'a', b: 'b'}, [:d, :e])
 puts ({a: 'a', b: 'b'})

, но это не так:

 puts ({a: 'a', b: 'b'}, [:d, :e])
 puts (Hash[a: 'a', b: 'b'], [:d, :e])

Может кто-нибудь объяснить, что на самом деле происходит позадисцены?

1 Ответ

0 голосов
/ 10 мая 2018

У Руби есть глюк, потому что он слишком уместен с круглыми скобками. Вы можете оставить их почти что угодно, но ...

puts{} анализируется как "вызов puts с блоком {}." Блок, в свою очередь, должен содержать завершенные операторы, а не список, разделенный запятыми ,. Таким образом, вы получите неправильную синтаксическую ошибку.

Исправление просто puts({})

Далее puts () анализируется как "puts, за которым следует один аргумент в скобках". Итак, опять же, парсер не может иметь дело с запятой , внутри скобки. Исправление заключается в том, чтобы убрать пространство: puts()

...