2012-04-16 7 views
2

は、そのような機能上の実存演算子使用:coffeescript existential function演算子else文?コーヒースクリプトで

myFunc?() 

typeof myFunc === "function" ? myFunc() : void 0; 

にコンパイルすると、エレガントな「空隙0」の代わりに行くかを定義する方法はありますか?元の表記を使用する代わりに、すべて書き出す必要がありますか?

+0

私はこのようなショートカットが便利だと思いますが、Coffeescriptがもっと一般的な形式で書き直すと良いでしょう: 'if(typeof myFunc == 'function')myFunc();'よくもちろん、それはとにかく普通のテストであり、時には失敗するため、ホストオブジェクトに決して適用されるべきではありません。テストで '==='の必要はまったくなく、 'typeof'は常に(ECMA-262による)文字列を返すので、Typeは常に一貫しています。 – RobG

+0

@RobGこれは一般的な解決策ではありません。なぜなら、function-existentialの戻り値を使用するのが一般的だからです。これは、余分なコードがあるように見える場合、多くの場合、3進数が好まれる理由です。 –

+0

あなたは私を失ってしまった。私が提案するテストは、三元表現のものとまったく同じです。それは、期待されていることを正確に行い、その後にクリーンアップするためにスーパーフルコードを必要としないので、(少なくとも私によって)好まれます。これは、三元形式が不適切であることを示唆しています。 – RobG

答えて

8

あなたは別の実存のオペレータを追加することができます

x = f?() ? 'pancakes' 

動作しない場合f()戻りnullまたはundefinedしかしf()戻りfalse場合、それは正しいことを行うだろう。たとえば、次のように

f = 'not a function' 
console.log f?() ? 'pancakes' 
# pancakes 

f = -> 'is a function' 
console.log f?() ? 'pancakes' 
# is a function 

f = -> null 
console.log f?() ? 'pancakes' 
# pancakes 

f = -> 
console.log f?() ? 'pancakes' 
# pancakes 

f = -> false 
console.log f?() ? 'pancakes' 
# false 

デモ:

http://jsfiddle.net/ambiguous/f6yvN/1/だからあなたはあなたが望むものに近い得ることができ、それはあなたが返す関数を期待しているものがどんなものなのかに応じて、十分に近いかもしれません。

+0

お願いします。三項式への変換は愚かです。それを複合化しないでください。 'typeof obj == 'function''は、いくつかの環境(例えば、XMLHttpRequestオブジェクトのように、IEのActiveXオブジェクトとして実装されたオブジェクト)のいくつかの呼び出し可能オブジェクトに対してfalseを返すことに注意してください。 'typeof'はホストオブジェクトに対して何かを返すことができます。 – RobG

+0

@RobG:あなたは間違った男に不平を言っていると思います。 IEが賢明に動作しない場合は、それをラップして、それが良い責任ある市民のように動作するようにします。 IEの動作に問題がない例を知っていますか?私は '? 'の主な目的は、コールバックを扱う際に、何らかのヌルチェックを省略することです。私は確かにCSのための憎悪の私のシェアを持っているが、この演算子はそれの一部ではありません。 –

+0

これは私が期待していたとおりに正確に動作しません。もし私がすれば f?()? console.log 'test' fが関数であっても、常に 'test'を記録します。 – Lactose