Оператор расширения CoffeeScript, модифицирующий 'this'? - PullRequest
0 голосов
/ 22 февраля 2012

Я недавно наткнулся на что-то.Я хотел добавить возможность удаления объекта из массива следующим образом:

someArray.remove(element)

Я хотел использовать оператор CoffeeScript extend и сделать следующее:

Array::remove = (element) ->
  return false unless _.include(this, element)
  this = this.splice(_.indexOf(this, element), 1)
  true

Но созданная функция-прототип указывает this на сам объект Array, поэтому единственный способ - вернуть что-то, что будет выглядеть так:

someArray = someArray.remove(element)

и реализацию для этогонапример:

Array::remove = (element) ->
  return this unless _.include(this, element)
  this.splice(_.indexOf(this, element), 1)

В ruby ​​это точная разница между join и join!.

Есть ли способ достичь этого?

Ответы [ 2 ]

2 голосов
/ 22 февраля 2012

Я думаю, что вы ошибаетесь по поводу splice.Он работает на самом массиве.Это, кажется, делает свое дело, если я полностью не понял ваш вопрос:

_ = require "underscore"

Array::remove = (element) ->
  index = _.indexOf @, element
  return false if index is -1
  @splice index, 1
  true

foo = ["a", "b", "c"]
console.log foo            # => ['a', 'b', 'c']
console.log foo.remove "b" # => true
console.log foo            # => ['a', 'c']
console.log foo.remove "d" # => false
console.log foo            # => ['a', 'c']

Обратите внимание, что coffeescript включает в себя прокладку для indexOf, поэтому подчеркивание не является строго необходимым, поэтому вы можете сделать:

Array::remove = (element) ->
  index = @indexOf element
  return false if index is -1
  @splice index, 1
  true
1 голос
/ 22 февраля 2012

Я реализовал это как:

Array::remove = (element) ->
  return false unless element in @
  @splice(@indexOf(element), 1)
  true

И это прекрасно работает. Я не уверен, какая у вас проблема с переменной this, но вы должны заметить, что splice меняет исходный массив, поэтому нет необходимости в назначении. Ваша первая реализация даже не компилируется для меня, потому что CoffeeScript не позволяет назначить this.

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