web-dev-qa-db-ja.com

Coffeescript || =アナログ?

私は主にRails開発者なので、会社のHubotインスタンス用の小さなスクリプトを作成する際に、次のことを達成したいと思っていました。

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

または、この新しいハッシュがまだ存在しない場合にのみ作成します。スクリプトを介して連絡先配列を動的に追加して、Hubotのソースを変更する必要がなく、追加した連絡先を上書きしたくないという考えです。

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

乾杯。

45
Nick Coelius

条件付き割り当てには?=を使用できます。

speed ?= 75

?はCoffeeScriptの「存在演算子」であるため、存在をテストします(真実性ではありません)。

if (typeof speed === "undefined" || speed === null) speed = 75;

ただし、変数だけでなくオブジェクトプロパティをテストしているため、結果のJSは少し異なります。したがって、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/

63
coreyward

私は個人的にor=の代わりに?=を使用しています。これは主に、Rubyで使用するときに||=(または同等)と呼ぶためです。

robot.brain.data.contacts or= {}

違いは、or=nullでない場合、robot.brain.data.contactsが短絡するのに対し、?=nullをテストし、robot.brain.data.contacts{}そうでない場合はnull

コンパイルされた違いを参照してください。

別の投稿で述べたように、どちらのメソッドもrobotrobot.brain、またはrobot.brain.dataの存在をチェックしませんが、Ruby同等のものもチェックしません。

編集:

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

12
Sandro

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

speed ?= 25のように使用してください

7
nicholaides

これはCoffeescriptでは実存演算子と呼ばれ、?=http://coffeescript.org/ 。以下の引用:

実存的な演算子

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

また、数値や文字列を処理する場合に、|| =が提供するよりも安全な条件付き代入に使用することもできます。

4
Marius Kjeldahl

CoffeeScriptのCoco方言 http://github.com/satyr/coco は、配列とオブジェクトの自動生存演算子をサポートしています@および@@

robot@brain@[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 = {});
1
AKX