Coffeescript || =类比?

Nic*_*ius 45 ruby-on-rails coffeescript

我主要是一个Rails开发人员,所以在为我公司的Hubot实例添加一个小脚本时,我希望能够完成以下任务:

robot.brain.data.contacts ||= {}
Run Code Online (Sandbox Code Playgroud)

或者,如果它尚不存在,则仅生成此新哈希.想法是我希望通过脚本动态添加联系人数组,这样我就不必修改Hubot的源代码了,我显然不想覆盖我添加的任何联系人.

问题:是否有像Rails || =这样的快速小构造,我可以在Coffeescript中使用它来实现上述目标?

干杯.

cor*_*ard 63

您可以使用?=条件分配:

speed ?= 75
Run Code Online (Sandbox Code Playgroud)

?是CoffeeScript中的"存在运算符",因此它将测试存在性(不是真实性):

if (typeof speed === "undefined" || speed === null) speed = 75;
Run Code Online (Sandbox Code Playgroud)

但是,在您的情况下,生成的JS有点不同,因为您正在测试对象属性,而不仅仅是变量,因此robot.brain.data.contacts ?= {}导致以下结果:

var _base, _ref;
if ((_ref = (_base = robot.brain.data).contacts) != null) {
  _ref;
} else {
  _base.contacts = {};
};
Run Code Online (Sandbox Code Playgroud)

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


San*_*dro 12

我个人使用or=而不是?=主要是因为||=当我在Ruby中使用它时,我称之为(或等于).

robot.brain.data.contacts or= {}
Run Code Online (Sandbox Code Playgroud)

不同的是or=短路的时候robot.brain.data.contacts是不是null,而?=做检查null,只设置robot.brain.data.contacts{}如果不null.

查看编译后的差异.

正如另一篇文章中所提到的,这两种方法都没有检查是否存在robot,robot.brain或者robot.brain.dataRuby等效.

编辑:

此外,在CoffeeScript中or=||=编译成相同的JS.


nic*_*des 7

?=如果它是null或将分配一个变量undefined.

像它一样使用它 speed ?= 25