2011-08-29 7 views
1

CoffeeScript에서 for 루프의 출력을 참조하는 올바른 방법이 있습니까? 내부 변수 _results을 사용하는 것은 시간이 걸리는 것처럼 보이지만 일부 상황에서는 작동합니다 (아래 참조). 안정적인 축전지를 참조하는 "올바른"방법이 있습니까?for 루프 동안 accumulator를 참조하는 것이 안전합니까?

작품

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

가 작동하지 않습니다는

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) 
+0

어떠한 경우에도 누적기에 접근 할 수 없어야합니다. 당신이 필요하다고 생각하면, 당신은 뭔가 잘못하고 있습니다. 어큐뮬레이터의 이름은 경고없이 변경 될 수 있으므로 사용하지 마십시오. 첫 번째 예가 github (https://github.com/jashkenas/coffee-script/issues/1637)의 버그로보고되었습니다. –

+0

@Aaron 그건 내 가정이었다. 나는 첫 번째 예가 효과가 있었음에도 놀랐다. –

답변

3

어큐뮬레이터는 (_results2에 반복자의 이름을 변경) 구현 세부 사항. 당신은 그것과 상호 작용하려는 것이 아닙니다. 이름을 이미 사용하고있는 경우 변수의 이름을 변경하는 이유입니다. reduce() 함수가 필요한 것처럼 들리지만 (파이어 폭스가 내장되어 있고 대부분의 인기있는 라이브러리에 지원이 포함되어 있습니다).

0

CoffeeScript에서 직접 _results과 같은 생성 된 변수와 상호 작용할 수 있다고 생각하지 않습니다. 당신은, 그러나, (컴파일러는 단순히 무시) 탈출 자바 스크립트 그렇게 할 수 있습니다 :

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 라인의 다음 unique 기능의 구현에 관해서는

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

(그리고 나는이 제쳐두고 약간의 실감)이 있기 때문에, 당신이 그것을 큰 N 잘 규모 않을거야 알고 있어야합니다 (런타임의 indexOf이 O (N) 효율보다 우수한 특별한 경우를 제외하고) 커다란 배열을 반복해야합니다. 비교적 큰 해시를 사용하여 N을 비교적 효율적으로 처리 할 수 ​​있습니다. Underscore.js의 제안 된 구현을 참조하십시오. _.uniq here.

+0

필자는 내 질문에 'Array :: unique'을 예로 사용했습니다. 나는 효율성에별로 신경 쓰지 않지만, 언더 코어에 나를 가르쳐 주셔서 고마워. :) –

+0

또한 나는 두 번째 제안 된 커피점 예제가 작동한다고 생각하지 않는다. –

+0

@Kendall 오식, 오타가 수정되었습니다. –