46 votes

Coffeescript || = analogique?

Je suis principalement un développeur Rails, et donc, en fouettant jusqu'à un petit script pour mon entreprise Hubot exemple, j'étais dans l'espoir d'accomplir le suivant:

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

Ou, seulement de faire de cette nouvelle table de hachage si elle n'existe pas déjà. L'idée étant que je veux avoir une contacts tableau ajouté dynamiquement par le script, donc je n'ai pas à modifier Hubot de la source, et je ne veux évidemment pas de remplacer les contacts que j'ai ajouter à elle.

Question: est-il un peu rapide de construction comme les Rails ||= que je peux utiliser dans Coffeescript pour atteindre l'objectif ci-dessus?

Des acclamations.

65voto

coreyward Points 26109

Vous pouvez utiliser ?= pour la cession conditionnelle:

speed ?= 75

L' ? est le "Existentielle" d'Opérateur en CoffeeScript, de sorte qu'il permettra de tester l'existence (pas truthiness):

if (typeof speed === "undefined" || speed === null) speed = 75;

Le résultant JS est un peu différent dans votre cas, cependant, parce que vous êtes à l'essai une propriété de l'objet, et pas seulement une variable, robot.brain.data.contacts ?= {} les résultats dans la suite:

var _base, _ref;
if ((_ref = (_base = robot.brain.data).contacts) != null) {
  _ref;
} else {
  _base.contacts = {};
};

Plus d'infos: http://jashkenas.github.com/coffee-script/

12voto

Sandro Points 3268

Personnellement, j'utilise or= au lieu de ?= , principalement parce que c'est ce que j'appelle ||= (ou égal) lorsque je l'utilise en Ruby.

robot.brain.data.contacts or= {}

La différence étant que, or= court-circuits lors de la robot.brain.data.contacts n'est null, alors que ?= tests pour null et que les ensembles robot.brain.data.contacts de {} si ce n' null.

Voir la compilation différence.

Comme mentionné dans un autre post, ni la méthode vérifie l'existence d' robot, robot.brain ou robot.brain.data, mais il ne le Rubis équivalent.

Edit:

Aussi, en CoffeeScript or= et ||= de la compilation à la même JS.

7voto

nicholaides Points 7859

?= assignera une variable si c'est null ou undefined .

Utilisez-le comme speed ?= 25

4voto

Marius Kjeldahl Points 4325

Il est appelé l'opérateur existentiel en Coffeescript et est - ?=, http://coffeescript.org/. Citant ci-dessous:

L'Opérateur Existentiel

C'est un peu difficile de vérifier l'existence d'une variable dans Le JavaScript. si (variable) est proche, mais ne parvient pas pour le zéro, le vide chaîne, et le faux. CoffeeScript existentiels de l'opérateur ? retourne true sauf si une variable est null ou undefined, ce qui la rend semblable à Ruby est nul?

Il peut également être utilisé pour la sécurité cession conditionnelle que ||= fournit, pour les cas où vous pourriez être la manipulation de nombres ou de chaînes de caractères.

1voto

AKX Points 14236

Le Coco le dialecte de CoffeeScript, http://github.com/satyr/coco , prend en charge le tableau et l'objet autovivification opérateurs @ et @@:

robot@brain@data@contacts.foo = 1

compile - accordé, poilues-recherche -

var _ref, _ref2;
((_ref = (_ref2 = robot.brain || (robot.brain = {})).data || (_ref2.data = {})).contacts || (_ref.contacts = {})).foo = 1;

qui veille à ce que chaque étape de la voie, robot.brain, brain.data, data.contacts existe réellement.

Bien sûr, vous pourriez vouloir le réel conditionnelle opérateur d'affectation (qui, selon les réponses ci-dessus, existe aussi en CoffeeScript):

robot.brain.data.contacts ?= {}

qui compile à

var _ref;
(_ref = robot.brain.data).contacts == null && (_ref.contacts = {});

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X