Coffeescript || = аналог?
Я в первую очередь разработчик Rails, и поэтому, взломав немного script для экземпляра моей компании Hubot, я надеялся выполнить следующее:
robot.brain.data.contacts ||= {}
Или, только сделайте этот новый хеш, если он еще не существует. Идея состоит в том, что я хочу иметь массив контактов, добавленный динамически через script, поэтому мне не нужно изменять источник Hubot, и я, очевидно, не хочу перезаписывать любые контакты, которые я добавляю к нему.
Вопрос: есть ли небольшая конструкция, такая как Rails || =, которую я могу использовать в Coffeescript для достижения указанной цели?
Приветствия.
Ответы
Ответ 1
Вы можете использовать ?=
для условного присвоения:
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/
Ответ 2
Я лично использую or=
вместо ?=
главным образом потому, что это то, что я называю ||=
(или равным), когда я использую его в Ruby.
robot.brain.data.contacts or= {}
Разница в том, что or=
короткое замыкание, когда robot.brain.data.contacts
не null
, тогда как ?=
проверяет null
и устанавливает только robot.brain.data.contacts
в {}
, если не null
.
См. скомпилированную разницу.
Как упоминалось в другом сообщении, ни один из методов не проверяет существование robot
, robot.brain
или robot.brain.data
, но и эквивалент Ruby.
Edit:
Кроме того, в CoffeeScript or=
и ||=
скомпилировать тот же JS.
Ответ 3
?=
назначит переменную, если она null
или undefined
.
Используйте его как speed ?= 25
Ответ 4
Он называется экзистенциальным оператором в Coffeescript и ?=
, http://coffeescript.org/. Цитирование ниже:
Экзистенциальный оператор
Немного сложно проверить наличие переменной в JavaScript. если (переменная) приближается, но не выполняется для нуля, пустая string и false. Экзистенциальный оператор CoffeeScript? возвращает true если переменная не равна null или undefined, что делает ее аналогичной Ruby no?
Он также может использоваться для более безопасного условного присвоения, чем || = обеспечивает, в случаях, когда вы можете обрабатывать числа или строки.
Ответ 5
Диалог Coco 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 = {});