如何在CoffeeScript中定义方便的度量单位语法?

如何在CoffeeScript中定义方便的度量单位语法?,coffeescript,units-of-measurement,Coffeescript,Units Of Measurement,在使用Groovy的过程中,作者介绍了如何使用Groovy技巧定义度量单位的语法,以便您可以编写,例如 3.cm + 12.m * 3 - 1.km 让它按预期工作。在CoffeeScript中,有没有办法定义一种类似的聪明语法,将测量单位与数字关联起来?(我对CoffeeScript非常陌生;如果这是一个已经解决或有明显答案的问题,我很抱歉。)不幸的是,用CoffeeScript无法做到这一点。您可以做的是(在CoffeeScript和JavaScript中): 这里的cm(),m(),km

在使用Groovy的过程中,作者介绍了如何使用Groovy技巧定义度量单位的语法,以便您可以编写,例如

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

让它按预期工作。在CoffeeScript中,有没有办法定义一种类似的聪明语法,将测量单位与数字关联起来?(我对CoffeeScript非常陌生;如果这是一个已经解决或有明显答案的问题,我很抱歉。)

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

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

(cm 3) + 3 * (m 12) - (km 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
,而不是调用它。

我认为这是最常用的,因为您可以在自己的模块中使用这些函数,并且只在您想要使用它们时才导入它们,而不必污染全局名称空间或JS内置对象

在Groovy中,您可以使用一个函数来避免用额外的方法污染内置类

但是,如果您不关心向内置对象添加内容,那么可以更进一步,使用使其语法与Groovy的示例完全相同:)


最后一个片段不正确。它编译成:
cm(3+3*m(12-km(1))
。您可以使用
(cm3)+(m3)*3-(km1)
,这与IMO的避免括号座右铭更加一致:)谢谢您的更正。我个人总是用括号:)是的。CoffeeScript中的括号是一个热门话题:P
Number::cm = ->
  this / 100

Number::m = ->
  this

Number::km = ->
  this * 1000


3.cm() + 12.m() * 3 - 1.km() # evaluates to -963.97
Object.defineProperties Number.prototype,
  km: {get: -> @ * 1000}
  m:  {get: -> @}
  cm: {get: -> @ * 0.01}

console.log 3.cm + 12.m * 3 - 1.km # -> -963.97