Как передать аргументы «подклассу» в coffeescript - PullRequest
0 голосов
/ 19 февраля 2012

У меня есть следующий код, который определяет прототип Iterator в coffeescript (расширяющий прототип Array):

App.Utils.Iterator = do ->
  Iterator =  ->
    Array.apply(this,arguments)
    ### this.push(i) for i in arguments : works but not good practice
    iter = 0
    @reset = ->
      iter = 0
    @getIndex = ->
      iter
    @getValue= ->
      this[iter]
    @next= ->
      this[++iter] if iter < this.length-1
    @previous= ->
      this[--iter] if iter>0
    @hasNext= ->
      return if this[iter+1] then true else return false
    @hasPrevious= ->
      return  if this[iter-1]then true else return false
    return this

  Iterator.prototype = new Array()
  Iterator.prototype.constructor = Array
  return Iterator

Все работает отлично, однако я хочу создать итератор как Array:

iterator = new App.Utils.Iterator(1,2,3,4)

который возвращает [] на консоли

как заставить его инициализировать мой итератор как обычный массив (new Array (1,2,3,4) возвращает [1,2,3,4]) без нажатия аргументов в функции конструктора (инструкция была прокомментирована в моем коде)

спасибо

1 Ответ

0 голосов
/ 23 февраля 2012

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

  1. разумным параметром для вашего конструктора является массив (new Iterator [1,2,3,4])
  2. Iterator не должен расширяться Array
  3. вместо сбросаитератор просто создает новый экземпляр для каждой итерации

Теперь к вашему вопросу.

Во-первых, без воссоздания набора шаблонов Javascript ваш код может быть переписан как:

class Iterator extends Array
  constructor: ->
    iter = 0
    @reset = ->
      iter = 0
    @getIndex = ->
      iter
    @getValue = ->
      @[iter]
    @next = ->
      @[++iter] if iter < @length-1
    @previous = ->
      @[--iter] if iter > 0
    @hasNext = ->
      if @[iter+1] then true else false
    @hasPrevious = ->
      if @[iter-1] then true else false
    super

Во-вторых, зачем слишком усложнять подобные вещи и вводить накладные расходы только ради «сокрытия» одной переменной в динамическом императивном языке?Код должен быть переписан в следующем виде:

class Iterator extends Array
  constructor: ->
    @iter = 0
    super
  reset: ->
    @iter = 0
  getIndex: ->
    @[@iter]
  # ...

В-третьих, невозможно передать список параметров в расширенный массив.Возможно, это проблема JavaScript, связанная с [].Предложенное вами выдвижение аргументов в конструкторе решения прекрасно.Учитывая все другие ошибки, которые вы допустите, если будете продолжать писать такой класс, я не думаю, что вопрос хорошей практики все равно должен вас беспокоить.

PS Почему кому-то понадобится итератор в Coffeescriptэто вопрос.Я думаю, вам лучше прочитать какую-нибудь книгу о Coffeescript, прежде чем углубляться в программирование библиотеки, которую вы не будете использовать.Попробуйте этот .

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