Я только начинаю работать с Coffeescript, поэтому, возможно, я спрашиваю что-то действительно тривиальное, но эта «ошибка» недавно сбила меня с толку:
class Foo
toJSON_1: ->
title: 'toJSON_1'
items: i for i in [1..5]
toJSON_2: ->
items: i for i in [1..5]
title: 'toJSON_2'
toJSON_3: ->
items: (i for i in [1..5])
title: 'toJSON_3'
foo = new Foo
console.log(foo.toJSON_1())
console.log(foo.toJSON_2())
console.log(foo.toJSON_3())
Я бы рассмотрел все эти эквивеланты, но посмотрите, что происходит с JSON_2
:
{ title: 'toJSON_1', items: [ 1, 2, 3, 4, 5 ] }
{ title: 'toJSON_2' }
{ items: [ 1, 2, 3, 4, 5 ], title: 'toJSON_3' }
Потребовалось некоторое время для отладки, потому что я следовал учебнику, используя нотацию JSON_1
, но в моем коде понимание списка не было последним пунктом (т.е. JSON_2
), пока я не наткнулся на тестирование JSON_3
.
Может кто-нибудь объяснить мне, почему парсер CoffeeScript работает таким образом? И какова правильная идиома в общем случае? Должен ли я всегда заключать списки в паренях? Похоже, ошибка, ожидающая, чтобы случиться, всегда предполагает, что будет только одно понимание списка, и это будет в конце объявления объекта.
Может быть, это просто особая ситуация правила парсера, о которой я не знаю ...?
EDIT:
Играя с компилятором и сгенерировав Javascript еще раз, похоже, что достаточно заключить код в {}
скобки для Coffeescript, чтобы сделать правильную вещь :
toJSON_2: ->
{
items: i for i in [1..5]
title: 'toJSON_2
}
Полагаю, мой вопрос сводится к:
- более идиоматично использовать скобки
{}
или ставить скобки
вокруг списка пониманий?
- Является ли это "непредсказуемое" поведение ошибкой?
- если нет, то почему?