我有以下代码,它在coffeescript (扩展数组原型)中定义了一个迭代器原型:
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
一切都很好,但是我想像数组一样实例化迭代器:
iterator = new App.Utils.Iterator(1,2,3,4)
它在控制台上返回[]
如何让它像常规数组一样初始化我的迭代器( new Array( 1,2,3,4 )返回1,2,3,4)而不推入构造函数中的参数(指令在我的代码中已被注释)
谢谢
发布于 2012-02-23 04:40:04
你的代码中有几个设计错误,因为你试图创建的实体根本不是迭代器。迭代器是用来迭代现有数组或其他可迭代数据类型的东西-它不是迭代器本身。这就是为什么:
重置迭代器的一个合理参数是数组,不应该扩展Array
现在来回答你的问题。
首先,无需重新创建一堆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问题。您提出的在构造函数解决方案中推送参数的建议很好。如果你仍然坚持编写这样的类,考虑到你会犯的所有其他错误,我认为良好实践的问题无论如何都不应该困扰你。
另外,为什么有人需要在Coffeescript中使用迭代器,这是一个问题。我认为你最好先读一些关于Coffeescript的书,然后再开始编写一个你不会用到的库。试试this one。
https://stackoverflow.com/questions/9349709
复制相似问题