Я категорически не согласен с утверждением, что Enums бесполезны из-за динамической природы Javascript или Enums являются более менее прославленными хэшами.
Цитируя Википедию: «Переменной, которая была объявлена как имеющая перечисляемый тип, может быть назначен любой из перечислителей в качестве значения». И только эти перечислители возможны в качестве значений.
Coffeescript может легко и синтаксически подражать Enum. Включая обработку ошибок недопустимых значений перечисления (хотя и только во время выполнения)
Я создал пример, который в основном функциональный и использует анонимный обратный вызов
функционирует как средство присваивания - в основном подставляя оператор присваивания "=" для
Coffeescripts оператор функции "->". Это делает самый синтаксически плотный код в моей книге.
Однако более классовый подход, безусловно, возможен.
#define enumeration
httpcodes = Enum
ok: 200
badRequest: 400
unauthorized: 401
server_error: 500
#set enum variables with some default state
chrome = httpcodes -> @server_error
firefox = httpcodes -> @server_error
safari = httpcodes -> @server_error
console.log "httpcodes.ok:" + httpcodes.ok
#change enum value
chrome -> @ok
firefox -> @badRequest
safari -> @unauthorized
console.log "chrome:" + chrome ->
console.log "firefox:" + firefox ->
console.log "safari:" + safari ->
console.log "(chrome ->) == httpcodes.ok:" + ((chrome ->) == httpcodes.ok)
#set an invalid value
try
safari -> 999
catch err
console.log err
console.log "safari:" + safari ->
А вот код для создания Enum (вам нужно поместить его поверх кода
если вы хотите запустить его. Просто хотел показать код использования перед кодом реализации
Enum = (enumeration)->
check = (value)->
newval = null
for key, val of enumeration
if val == value
newval = value
break
if !newval
throw "Invalid Enum Value: #{value}"
result = (init)->
state = init.call(enumeration)
check state
(callback)->
value = callback.call(enumeration)
if value == null or value == undefined
return state
else
check value
state = value
for key, value of enumeration
result[key] = value
result
Очевидно, было бы намного приятнее, если бы Coffeescript имел синтаксические макросы.
Таким образом, мы могли бы написать
Enum httpcodes
ok: 200
badrequest: 400
и
chrome = httpcodes 'ok
#or
chrome := 'ok