Безопасно ли ссылаться на аккумулятор во время цикла for? - PullRequest
1 голос
/ 29 августа 2011

Есть ли правильный способ ссылки на вывод цикла for в CoffeeScript.Кажется, что использование внутренней переменной _results иногда работает, но в некоторых ситуациях (показано ниже).Есть ли "правильный" способ ссылки на стабильный аккумулятор?

Работает

Array::unique = ->
  value for value in this when not (value in _results)

Не работает (переименовывает итератор в _results2)

Array::unique = ->
  _results = null
  value for value in this when not (value in _results)

Также не работает (переименовывает итератор в _results2)

Array::unique = ->
  value for value in (value for value in this) when not (value in _results)

Ответы [ 2 ]

3 голосов
/ 29 августа 2011

Аккумулятор - это деталь реализации. Вы не должны взаимодействовать с этим. Вот почему она переименовывает переменную, если вы уже используете имя. Звучит так, как будто вам нужна функция redu () (она встроена в Firefox, и большинство популярных библиотек поддерживают ее).

0 голосов
/ 29 августа 2011

Я не верю, что возможно взаимодействовать с сгенерированными переменными, такими как _results, непосредственно из CoffeeScript. Вы можете, однако, сделать это с помощью escape-JavaScript (который компилятор просто игнорирует):

Array::unique = ->
  value for value in this when not (`value in _results`)

компилируется в

Array.prototype.unique = function() {
  var value, _i, _len, _results;
  _results = [];
  for (_i = 0, _len = this.length; _i < _len; _i++) {
    value = this[_i];
    if (!value in _results) {
      _results.push(value);
    }
  }
  return _results;
};

Тем не менее, стилистически я думаю, что было бы предпочтительнее кодировать ваше понимание списка в чистом CoffeeScript. Это всего 3 строки:

Array::unique = ->
  results = []
  results.push value for value in this when value not in results
  results

Что касается вашей реализации функции unique (и я понимаю, что это немного в стороне), вы должны знать, что она не будет хорошо масштабироваться для больших N, так как она должна повторяться через большие массивы (за исключением особых случаев, когда indexOf времени выполнения имеет эффективность лучше, чем O (N)). Однако можно обрабатывать большие N относительно эффективно, используя хэш; посмотрите предложенную мной реализацию Underscore.js _.uniq здесь .

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