我主要是Rails開發者,因此,在激起了我公司的Hubot例如一個小劇本,我希望能做到以下幾點:的CoffeeScript || =類似物?
robot.brain.data.contacts ||= {}
或者,如果它不」,才使這個新的哈希t已經存在。這個想法是,我想有一個觸點陣列動態添加通過腳本,所以我不必修改Hubot的來源,我顯然不希望覆蓋我增加它的任何接觸。
問:是否有一個小巧的構造就像Rails的|| =我可以在CoffeeScript中使用實現上述目標?
乾杯。
我主要是Rails開發者,因此,在激起了我公司的Hubot例如一個小劇本,我希望能做到以下幾點:的CoffeeScript || =類似物?
robot.brain.data.contacts ||= {}
或者,如果它不」,才使這個新的哈希t已經存在。這個想法是,我想有一個觸點陣列動態添加通過腳本,所以我不必修改Hubot的來源,我顯然不希望覆蓋我增加它的任何接觸。
問:是否有一個小巧的構造就像Rails的|| =我可以在CoffeeScript中使用實現上述目標?
乾杯。
可以使用?=
有條件分配:
speed ?= 75
的?
是 「生存經營者」 中的CoffeeScript,所以它會測試存在(不感實性):
if (typeof speed === "undefined" || speed === null) speed = 75;
產生的JS在你的情況有點不同,但是,因爲你正在測試的對象prope RTY,而不僅僅是一個變量,因此robot.brain.data.contacts ?= {}
結果如下:
var _base, _ref;
if ((_ref = (_base = robot.brain.data).contacts) != null) {
_ref;
} else {
_base.contacts = {};
};
?=
將分配變量,如果它是null
或undefined
。
使用它像speed ?= 25
這就是所謂的生存運營商的CoffeeScript是?=
,http://coffeescript.org/。下面引用:
的生存操作
這是一個有點難以 JavaScript來檢查一個變量的存在。如果(變量)接近,但沒有零,空字符串 ,假。 CoffeeScript的存在操作符?返回true 除非變量爲空或未定義的,這使得它類似於 Ruby的零?
它也可以用於比|| = 規定的更安全的條件賦值,適用於您可能正在處理數字或字符串的情況。
我個人使用or=
代替?=
主要是因爲這就是我所說的||=
(或相等的),當我在Ruby中使用它。
robot.brain.data.contacts or= {}
的不同之處在於or=
短路時robot.brain.data.contacts
不是null
,而?=
試驗null
且僅當未設置null
到robot.brain.data.contacts
{}
。
正如在另一篇文章中提到,爲了robot
,robot.brain
robot.brain.data
或存在既不方法檢查,但同樣沒有Ruby的等效。
編輯:
此外,在CoffeeScript中or=
和||=
編譯相同的JS。
的CoffeeScript,http://github.com/satyr/coco的可可方言,支持陣列和對象自動激活運營商@
和@@
:
[email protected]@[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 = {});
'或='和'?='不能編譯成相同的JS。 '?='做一個空檢查。參見[此](http://coffeescript.org/#try:a%20%3D%20b%20%3D%200%0A%0Aa%20or%3D%201%3B%0Ab%20%3F%3D% 201%3B)使用不同的變量名稱時的差異。 – 2013-09-30 13:06:36