Coffeescript ||= 模拟?

Posted

技术标签:

【中文标题】Coffeescript ||= 模拟?【英文标题】:Coffeescript ||= analogue? 【发布时间】:2012-03-23 06:34:29 【问题描述】:

我主要是一名 Rails 开发人员,因此在为我公司的 Hubot 实例编写一个小脚本时,我希望完成以下工作:

robot.brain.data.contacts ||= 

或者,仅当它不存在时才创建此新哈希。我的想法是我想通过脚本动态添加一个联系人数组,这样我就不必修改 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= 

区别在于robot.brain.data.contacts 不是nullor= 短路,而?= 测试null,如果不是null,则仅将robot.brain.data.contacts 设置为

See the compiled difference.

正如在另一篇文章中提到的,这两种方法都不会检查 robotrobot.brainrobot.brain.data 的存在,但 Ruby 等价物也不会。

编辑:

另外,在 CoffeeScript 中,or=||= 编译成同一个 JS。

【讨论】:

or=?= 不会编译为相同的 JS。 ?= 进行空检查。使用不同变量名时的区别见this。 @KennethKalmer:没有人说它们是等价的。 or=||= 是等价的,而不是 ?=【参考方案3】:

?= 将分配一个变量,如果它是 nullundefined

speed ?= 25一样使用它

【讨论】:

【参考方案4】:

在 Coffeescript 中称为存在运算符,为?=、http://coffeescript.org/。引用如下:

存在运算符

检查变量是否存在有点困难 javascript。如果(变量)接近,但失败为零,则为空 字符串,为假。 CoffeeScript 的存在运算符 ?返回真 除非变量为 null 或未定义,这使得它类似于 Ruby 是零?

它也可以用于比 ||= 更安全的条件赋值 提供,用于处理数字或字符串的情况。

【讨论】:

【参考方案5】:

CoffeeScript 的 Coco 方言 http://github.com/satyr/coco 支持数组和对象自动生存运算符 @@@

robot@brain@data@contacts.foo = 1

编译成 - 理所当然,毛茸茸的 -

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

这确保了每一步,robot.brainbrain.datadata.contacts 确实存在。

当然,您可能只需要实际的条件赋值运算符(根据上述答案,CoffeeScript 中也存在该运算符):

robot.brain.data.contacts ?= 

编译成

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

【讨论】:

【参考方案6】:

a ||= b 表示如果a 存在,则什么也不做。如果a 不存在,则使其等于b

示例 1:

a = undefined;
console.log(a ||= "some_string") //prints some_string

示例2:

a = 10
console.log(a ||= "some_string") //prints 10

【讨论】:

以上是关于Coffeescript ||= 模拟?的主要内容,如果未能解决你的问题,请参考以下文章

Coffeescript ||= 模拟?

使用咖啡脚本的正确时间

我可以直接从 node.js 运行 .coffee 文件吗?

COFF文件格式

PE文件和COFF文件格式分析——签名COFF文件头和可选文件头2

COFF - 中间文件格式解析