私は主にRails開発者なので、会社のHubotインスタンス用の小さなスクリプトを作成する際に、次のことを達成したいと思っていました。
robot.brain.data.contacts ||= {}
または、この新しいハッシュがまだ存在しない場合にのみ作成します。スクリプトを介して連絡先配列を動的に追加して、Hubotのソースを変更する必要がなく、追加した連絡先を上書きしたくないという考えです。
質問:上記の目標を達成するためにCoffeescriptで使用できるRails || =のような簡単な構造はありますか?
乾杯。
条件付き割り当てには?=
を使用できます。
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 = {};
};
私は個人的にor=
の代わりに?=
を使用しています。これは主に、Rubyで使用するときに||=
(または同等)と呼ぶためです。
robot.brain.data.contacts or= {}
違いは、or=
がnull
でない場合、robot.brain.data.contacts
が短絡するのに対し、?=
はnull
をテストし、robot.brain.data.contacts
を{}
そうでない場合はnull
。
別の投稿で述べたように、どちらのメソッドもrobot
、robot.brain
、またはrobot.brain.data
の存在をチェックしませんが、Ruby同等のものもチェックしません。
編集:
また、CoffeeScriptではor=
と||=
を同じJSにコンパイルします。
?=
は、null
またはundefined
の場合に変数を割り当てます。
speed ?= 25
のように使用してください
これはCoffeescriptでは実存演算子と呼ばれ、?=
、 http://coffeescript.org/ 。以下の引用:
実存的な演算子
JavaScriptで変数の存在を確認するのは少し難しいです。 (変数)が近づいたが、ゼロ、空の文字列、およびfalseで失敗した場合。 CoffeeScriptの実存演算子?変数がnullまたは未定義でない限り、trueを返します。これにより、Rubyのnilに類似していますか?
また、数値や文字列を処理する場合に、|| =が提供するよりも安全な条件付き代入に使用することもできます。
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.brain
、brain.data
、data.contacts
実際に存在します。
もちろん、実際の条件付き代入演算子(上記の回答によれば、CoffeeScriptにも存在します)が必要な場合もあります。
robot.brain.data.contacts ?= {}
コンパイルされます
var _ref;
(_ref = robot.brain.data).contacts == null && (_ref.contacts = {});