1

这个使用 Groovy 的示例中,作者描述了如何使用 Groovy 技巧来定义度量单位的语法,这样您就可以编写,例如,

3.cm + 12.m * 3 - 1.km

并让它按预期工作。有没有什么方法可以定义类似的巧妙语法来将计量单位与 CoffeeScript 中的数字关联起来?(我对 CoffeeScript 很陌生;对不起,如果这已经解决了或者有一个明显的答案。)

4

3 回答 3

2

我认为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
于 2012-09-20T15:24:21.303 回答
1

我不会推荐它,但这有效:

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而不是调用它。

于 2012-09-20T08:33:17.690 回答
0

不幸的是,CoffeeScript 无法做到这一点。你可以做的是(在 CoffeeScript 和 JavaScript 中):

cm(3) + m(12) * 3 - km(1)

这里cm(), m(),km()是将值转换为例如米的函数。就 CoffeeScript 而言,以下表达式

(cm 3) + 3 * (m 12) - (km 1)

也是有效的。

于 2012-09-20T06:23:45.783 回答