我正在研究coffeescript(http://coffeescript.org/)中的枚举/常量的概念,并想出了下面的以下代码,看起来不错。我如何才能将其改进为适合枚举的东西呢?谷歌对此的搜索尚未显示满意。
class SomeService
@SomeEnumValue : 400
@SomeOtherValue : 402
someFunc: ->
SomeService.SomeEnumValue
ok = new SomeService()
alert ok.someFunc()
if (ok.someFunc() == SomeService.SomeEnumValue) then alert ' some enum value'
枚举的整个概念在动态语言中是没有用的,就像元组,类型列表,地图和许多其他东西一样,而Javascript(咖啡脚本)是动态的。在使用动态语言时,您只需要忘记类型检查并使用现有的更通用的结构来解决您的问题。使用数组代替列表和元组,使用对象代替映射和枚举,只相信传递给函数的值的类型,但对代码进行大量的单元测试。无论好坏(对于更糟糕的IMO),这都是在这里完成的工作。
在您的情况下,我建议仅将值存储在一个单例对象中,如下所示:
HTTPStatusCodes =
ok : 200
badRequest : 400
unauthorized : 401
并且像这样访问它:
class SomeService
okCode: ->
HTTPStatusCodes.ok
failureCodes: ->
code for key, code of HTTPStatusCodes when code >= 400
[我知道我参加晚会很晚,但是为了后代,我提出了一个“ coffeethonic”解决方案(本着少打字的精神:]]
[ a, b, c ] = [1..3]
我强烈反对这样的说法:由于Javascript的动态特性,Enums毫无用处,或者Enums的荣耀散列更少。
Colors = Object.freeze({
RED: 'red'
GREEN: 'green'
BLUE: 'blue'
})
console.log Colors.RED
# red
我开始想知道咖啡脚本中的enums
,然后以解决方案I published on github (available in npm, bower, meteor too)结束。我尝试开发类似Java的枚举,但是鉴于原型继承和经典继承coffeescript所依赖的混合,它甚至更加灵活。
对于正在寻找更简单解决方案的人们,不需要故障保护,因为密钥的值无关紧要: