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
不是null
时or=
短路,而?=
测试null
,如果不是null
,则仅将robot.brain.data.contacts
设置为。
See the compiled difference.
正如在另一篇文章中提到的,这两种方法都不会检查 robot
、robot.brain
或 robot.brain.data
的存在,但 Ruby 等价物也不会。
编辑:
另外,在 CoffeeScript 中,or=
和 ||=
编译成同一个 JS。
【讨论】:
or=
和 ?=
不会编译为相同的 JS。 ?=
进行空检查。使用不同变量名时的区别见this。
@KennethKalmer:没有人说它们是等价的。 or=
和 ||=
是等价的,而不是 ?=
。【参考方案3】:
?=
将分配一个变量,如果它是 null
或 undefined
。
像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.brain
、brain.data
、data.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 ||= 模拟?的主要内容,如果未能解决你的问题,请参考以下文章
我可以直接从 node.js 运行 .coffee 文件吗?