2013-05-10 3 views
1

두 개의 문자열 중 하나가 splat 인수를 통과 할 때 두 문자열이 같은지 확인하는 데 문제가 있습니다. coffeescript는 엄격한 비교를 사용하고 splat을 통과 할 때 인수 사본을 만들기 때문에 역 따옴표를 사용하지 않고 문자열을 제대로 비교할 수 없습니다. 더 좋은 방법이 있습니까? 여기에 문제를 보여줍니다 코드의 최소한의 조각입니다 :Coffeescript - 스 플랫을 통해 문자열을 전달할 때 문자열 평등을 검사하려면 어떻게해야합니까?

check=(arg) -> 
    if arg == 'foo' then "'#{arg}'=='foo'" else "'#{arg}'!='foo'" 

emit=(args...) -> 
    check(args) 

console.log(emit('foo')) 
console.log(check('foo')) 

다음과 같이의 출력은 다음과 같습니다

> coffee mincase.coffee 
'foo'!='foo' 
'foo'=='foo' 

편집 : MU 나에게 열쇠를 준 너무 짧은 때문에 수정 작업 코드는 당신이 플랫을 사용하는 경우

emit=(args...)-> 
    check.apply(null,args) 

답변

2

는, 플랫 배열에 splatted 인수를두고 (모든 발광을 제외하고 동일)과 같습니다. 예를 들어 :

f = (x...) -> console.log(x instanceof Array) 
f(6) 

당신에게 콘솔에서 true을 줄 것이다. fine manual이 경우 너무 잘하지, 그것은 정확하게 당신이 자바 스크립트의 arguments 객체가 어떻게 작동하는지 이해하는 것이 가정 및 명시 적 플랫 배열 부분으로 인수를두고 밖으로 잎, 그것을 밖으로 철자하지 않습니다.

그래서 당신은 진실하지 않습니다 커피 스크립트의 == (또는 자바 스크립트의 ===)를 사용하여 문자열과 비교 check에 배열과 배열을 전달 끝낸다. 첫 번째 인수를 확인 emit을 원하는 경우에

, 당신은 이렇게 말할 필요가 :

emit = (args...) -> check(args[0]) 

데모 : http://jsfiddle.net/ambiguous/TBndM/

+0

감사합니다! 나는 실제로 내가 뭘했는지에 대한 자세한 내용을 나타 내기 위해 약간의 질문을 편집했으나 문제가 해결되었습니다. args를 얻는 대신 여러 개의 인수를 전달할 수 있도록 check.apply (null, args)를 수행하고 있습니다. (이 코드는 내가 게시 한 코드에서 명확하지 않습니다). http://jsfiddle.net/ambiguous/Gjh7G/ : – Erik

+1

@Erik : 당신이 apply', 예를 들어'명시 적으로 원하지 않을 경우에도 함수 호출 ('F (배열 ...)')에 플랫 수 –

+0

멋지다. 훨씬 좋네. 다시 한 번 감사드립니다. – Erik