Coffeescript || = analogique?

Je suis avant tout un développeur Rails, et en préparant un petit script pour l’instance Hubot de ma société, j’espérais accomplir les tâches suivantes:

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

Ou, ne faites que ce nouveau hash s’il n’existe pas déjà. L’idée étant que je souhaite avoir un tableau de contacts ajouté dynamicment via le script afin de ne pas avoir à modifier la source de Hubot, et je ne souhaite évidemment pas écraser les contacts que j’ajoute.

Question: existe-t-il une petite construction rapide comme les Rails || = que je peux utiliser dans Coffeescript pour atteindre l’objective ci-dessus?

À votre santé.

Vous pouvez utiliser ?= Pour une affectation conditionnelle:

 speed ?= 75 

Le ? est l’opérateur “Existential” dans CoffeeScript, donc il va tester l’existence (pas la véracité):

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

Le JS résultant est un peu différent dans votre cas, cependant, parce que vous testez une propriété d’object, pas seulement une variable, alors robot.brain.data.contacts ?= {} ce qui suit:

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

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

Personnellement, j’utilise or= au lieu de ?= Principalement parce que c’est ce que j’appelle ||= (ou-égal) quand je l’utilise en Ruby.

 robot.brain.data.contacts or= {} 

La différence étant que or= court-circuits lorsque robot.brain.data.contacts n’est pas null , alors que ?= robot.brain.data.contacts null et définit uniquement robot.brain.data.contacts sur {} si non null .

Voir la différence compilée.

Comme mentionné dans un autre article, aucune méthode ne vérifie l’existence de robot , robot.brain ou robot.brain.data , mais l’équivalent de Ruby non plus.

Modifier:

Aussi, dans CoffeeScript or= et ||= comstackr dans le même JS.

?= affectera une variable si elle est null ou undefined .

Utilisez-le comme speed ?= 25

Il s’appelle l’opérateur existentiel dans Coffeescript et est ?= , http://coffeescript.org/ . Citant ci-dessous:

L’opérateur existant

Il est un peu difficile de vérifier l’existence d’une variable en JavaScript. if (variable) se rapproche, mais échoue pour zéro, la chaîne vide et false. L’opérateur existentiel de CoffeeScript? renvoie true sauf si une variable est nulle ou non définie, ce qui la rend analogue à la valeur nulle de Ruby?

Il peut également être utilisé pour une affectation conditionnelle plus sûre que || = fournit, dans les cas où vous manipulez des nombres ou des chaînes.

Le dialecte Coco de CoffeeScript, http://github.com/satyr/coco , prend en charge les opérateurs d’autovivification de tableaux et d’objects @ et @@ :

 robot@brain@[email protected] = 1 

comstack à – accordé, regard poilu –

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

ce qui garantit que chaque étape, robot.brain , brain.data , data.contacts existe réellement.

Bien sûr, vous pourriez vouloir simplement l’opérateur d’affectation conditionnelle réelle (qui, selon les réponses ci-dessus, existe également dans CoffeeScript):

 robot.brain.data.contacts ?= {} 

qui comstack à

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