Как правильно использовать 'for..in' понимание списка внутри отступа объекта Coffeescript? - PullRequest
1 голос
/ 25 декабря 2011

Я только начинаю работать с 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
   }

Полагаю, мой вопрос сводится к:

  • более идиоматично использовать скобки {} или ставить скобки вокруг списка пониманий?
  • Является ли это "непредсказуемое" поведение ошибкой?
  • если нет, то почему?

Ответы [ 3 ]

3 голосов
/ 26 декабря 2011

Рекомендуется заключать выражения в скобки при построении массивов, потому что items = (item for item in list when x is y).

В toJSON_2 первая строка интерпретируется как

{ items: i } for i in [1..5]

Вы не можете винить в этом кофейный код, поскольку цель не ясна. Мой совет - следовать простому руководству: Все, что могло бы запутать человека, очень вероятно, запутает синтаксический анализатор .

Сюда входит перенос выражений в круглых скобках с использованием явных return s, скобок для литералов объектов, временных переменных и всего, что вам нужно, чтобы ваши намерения были понятны в коде.

1 голос
/ 27 декабря 2011

Следствие исправления # 1871 и # 1903 преждевременно.

0 голосов
/ 25 декабря 2011

Вот мое мнение как программиста, но не как человека, который еще использовал CoffeeScript (достаточно глубоко изучить его, насколько я зашел): при программировании ваше общее стремление должно заключаться в том, чтобы придать смысл вашего кода настолько очевидным и недвусмысленным, насколько вы можете (хотя могут быть и другие важные вещи, так что это не всегда будет самой важной целью).

Когда вы сталкиваетесь с такими отвратительными регионами (о которых некоторые пользователи CoffeeScript узнают, а некоторые - нет - в данном случае, я случайно прочитал об этом, когда проводил исследование CoffeeScript, прежде чем пытаться его использовать), вьющиеся Скобки делают это намного более очевидным и отчетливо однозначным. В то время как с другим у вас осталась хрупкая структура, в которую новичок внесет, казалось бы, совершенно безобидное изменение, но которое сломает его полностью (и вы можете этого не осознавать, и тогда отладка будет очень трудно).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...