Подтвердить что ты не робот

Coffeescript || = аналог?

Я в первую очередь разработчик Rails, и поэтому, взломав немного script для экземпляра моей компании Hubot, я надеялся выполнить следующее:

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

Или, только сделайте этот новый хеш, если он еще не существует. Идея состоит в том, что я хочу иметь массив контактов, добавленный динамически через script, поэтому мне не нужно изменять источник Hubot, и я, очевидно, не хочу перезаписывать любые контакты, которые я добавляю к нему.

Вопрос: есть ли небольшая конструкция, такая как Rails || =, которую я могу использовать в Coffeescript для достижения указанной цели?

Приветствия.

4b9b3361

Ответ 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 = {});