在这个使用 Groovy 的示例中,作者描述了如何使用 Groovy 技巧来定义度量单位的语法,这样您就可以编写,例如,
3.cm + 12.m * 3 - 1.km
并让它按预期工作。有没有什么方法可以定义类似的巧妙语法来将计量单位与 CoffeeScript 中的数字关联起来?(我对 CoffeeScript 很陌生;对不起,如果这已经解决了或者有一个明显的答案。)
在这个使用 Groovy 的示例中,作者描述了如何使用 Groovy 技巧来定义度量单位的语法,这样您就可以编写,例如,
3.cm + 12.m * 3 - 1.km
并让它按预期工作。有没有什么方法可以定义类似的巧妙语法来将计量单位与 CoffeeScript 中的数字关联起来?(我对 CoffeeScript 很陌生;对不起,如果这已经解决了或者有一个明显的答案。)
我认为BasicWolf 的答案是最惯用的,因为您可以在自己的模块中拥有这些功能,并且仅在您想使用它们时才导入它们,而不必污染全局命名空间或 JS 内置对象。
在 Groovy 中,您可以使用Category来避免使用额外的方法污染内置类。
但是,如果您不关心向内置对象添加东西,您可以更进一步,使用它Object.defineProperties
来使语法与 Groovy 的示例完全相同:)
Object.defineProperties Number.prototype,
km: {get: -> @ * 1000}
m: {get: -> @}
cm: {get: -> @ * 0.01}
console.log 3.cm + 12.m * 3 - 1.km # -> -963.97
我不会推荐它,但这有效:
Number::cm = ->
this / 100
Number::m = ->
this
Number::km = ->
this * 1000
3.cm() + 12.m() * 3 - 1.km() # evaluates to -963.97
你不能去掉括号,因为3.cm
引用了函数cm
而不是调用它。
不幸的是,CoffeeScript 无法做到这一点。你可以做的是(在 CoffeeScript 和 JavaScript 中):
cm(3) + m(12) * 3 - km(1)
这里cm()
, m()
,km()
是将值转换为例如米的函数。就 CoffeeScript 而言,以下表达式
(cm 3) + 3 * (m 12) - (km 1)
也是有效的。