2012-03-05 20 views
43

私は主にRailsの開発者だし、そう私の会社のHubotインスタンスのための小さなスクリプトをアップ鞭で、私は次のことを達成するために期待していた。Coffeescript || =アナログですか?

robot.brain.data.contacts ||= {} 

それとも、それはをdoesnの場合にのみ、この新しいハッシュを作りますtはすでに存在します。アイデアは、Hubotのソースを変更する必要がないように、スクリプトを介して連絡先配列を動的に追加したいということであり、私が追加する連絡先を上書きしたくないということです。

質問:上記の目標を達成するためにCoffeescriptで使用できるRails || =のような簡単な構文がありますか?

乾杯。

答えて

61

のようにそれを使用します(ないtruthiness)

speed ?= 75 

?はCoffeeScriptの中に "実存演算子" であるので、それは存在するかどうかをテストします:

結果のJSは、あなたのケースでは少し異なりますが、オブジェクトpropeをテストしているためですRTYだけではなく、変数、次のようでとてもrobot.brain.data.contacts ?= {}結果:

var _base, _ref; 
if ((_ref = (_base = robot.brain.data).contacts) != null) { 
    _ref; 
} else { 
    _base.contacts = {}; 
}; 

さらに詳しい情報:http://jashkenas.github.com/coffee-script/

7

?=は、nullまたはundefinedの場合は変数を割り当てます。

はあなたが条件付きの割り当てに?=を使用することができますspeed ?= 25

4

これはCoffeeScriptの中実存オペレーターと呼ばれると?=http://coffeescript.org/でいます。下に引用:

実存オペレータ

それは JavaScriptで変数の存在を確認するために少し難しいです。 (変数)が近づいてもゼロに失敗すると、空の 文字列、およびfalseが返されます。 CoffeeScriptの実在の演算子ですか?変数がnullまたは未定義でない限り を返します。 Rubyのnilに似ていますか?

数字や文字列を扱う場合には、|| = より安全な条件付き割り当てにも使用できます。それは私が||=(または-等しい)と呼んでいるものだから、私はRubyでそれを使用する場合、私は個人的に主にor=の代わり?=を使用

12

robot.brain.data.contacts or= {} 

ある差そのor=短絡しないnull場合?=nullのテストとのみ{}robot.brain.data.contactsを設定する一方robot.brain.data.contactsは、nullありません。

別の記事で述べたように

See the compiled difference.

robotrobot.brain又はrobot.brain.dataが存在するいずれの方法をチェックし、どちらもルビー相当しません。

編集:

また、CoffeeScriptのor=||=に同じJSにコンパイルします。

+1

'や' = '?='は同じJSにコンパイルされません。 '?='はヌルチェックを行います。 [this](http://coffeescript.org/#try:a%20%3D%20b%20%3D%200%0A%0Aa%20or%3D%201%3B%0Ab%20%3F%3D%を参照してください。 201%3B)異なる変数名を使用した場合の差異。 –

1

のCoffeeScript、http://github.com/satyr/cocoのココ方言は、配列オブジェクトautovivificationオペレータ@@@サポート: - 許可され、ヘアリー見通し -

[email protected]@[email protected] = 1 

がにコンパイル各ことを保証

var _ref, _ref2; 
((_ref = (_ref2 = robot.brain || (robot.brain = {})).data || (_ref2.data = {})).contacts || (_ref.contacts = {})).foo = 1; 

実際に存在するのは、robot.brainbrain.datadata.contactsです。もちろん

あなたは(、上記の回答によると、ものCoffeeScriptに存在する)は、実際の条件付き代入演算子たいだけかもしれません:

robot.brain.data.contacts ?= {} 

にコンパイル

var _ref; 
(_ref = robot.brain.data).contacts == null && (_ref.contacts = {}); 
関連する問題