2012-03-05 75 views
43

我主要是Rails開發者,因此,在激起了我公司的Hubot例如一個小劇本,我希望能做到以下幾點:的CoffeeScript || =類似物?

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

或者,如果它不」,才使這個新的哈希t已經存在。這個想法是,我想有一個觸點陣列動態添加通過腳本,所以我不必修改Hubot的來源,我顯然不希望覆蓋我增加它的任何接觸。

問:是否有一個小巧的構造就像Rails的|| =我可以在CoffeeScript中使用實現上述目標?

乾杯。

回答

61

可以使用?=有條件分配:

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 = {}; 
}; 

更多信息:http://jashkenas.github.com/coffee-script/

7

?=將分配變量,如果它是nullundefined

使用它像speed ?= 25

4

這就是所謂的生存運營商的CoffeeScript是?=http://coffeescript.org/。下面引用:

的生存操作

這是一個有點難以 JavaScript來檢查一個變量的存在。如果(變量)接近,但沒有零,空字符串 ,假。 CoffeeScript的存在操作符?返回true 除非變量爲空或未定義的,這使得它類似於 Ruby的零?

它也可以用於比|| = 規定的更安全的條件賦值,適用於您可能正在處理數字或字符串的情況。

12

我個人使用or=代替?=主要是因爲這就是我所說的||=(或相等的),當我在Ruby中使用它。

robot.brain.data.contacts or= {} 

的不同之處在於or=短路時robot.brain.data.contacts不是null,而?=試驗null且僅當未設置nullrobot.brain.data.contacts{}

See the compiled difference.

正如在另一篇文章中提到,爲了robotrobot.brainrobot.brain.data或存在既不方法檢查,但同樣沒有Ruby的等效。

編輯:

此外,在CoffeeScript中or=||=編譯相同的JS。

+1

'或='和'?='不能編譯成相同的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

1

的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 = {});