nie zgadzam się ze stwierdzeniem, że wyliczenia są bezużyteczne ze względu na dynamiczną naturę Javascriptu lub Enums to mniej gloryfikowane hasze.
Cytując Wikipedię: "Zmiennej, która została zadeklarowana jako posiadająca typ wyliczeniowy, można przypisać dowolny moduł wyliczający jako wartość." I tylko te enumeratory są możliwe jako wartości.
Coffeescript może z łatwością i syntaktycznie przyjemnie emulować Enum. W tym obsługa błędów na niepoprawnych wartościach wyliczeniowych (ale tylko w czasie wykonywania)
Utworzono przykład, który ma głównie charakter funkcjonalny i wykorzystuje anonimowe funkcje oddzwaniania jako podstawienie - w zasadzie zastępuje operatora przypisania "=" dla Operator funkcji Coffeescripts "->". Tworzy najbardziej składnie zwarty kod w mojej książce. Jednak bardziej klasowe podejście jest z pewnością możliwe.
#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 ->
A oto kod, aby utworzyć Enum (trzeba umieścić to na górze kod jeśli chcesz go uruchomić. Po prostu chciał pokazać kod użytkowania przed kodem realizacji
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
Oczywiście byłoby znacznie ładniej, gdyby Coffeescript zawierał makra syntaktyczne. Więc moglibyśmy napisać
Enum httpcodes
ok: 200
badrequest: 400
i
chrome = httpcodes 'ok
#or
chrome := 'ok
Czego dokładnie szukasz? JavaScript nie ma stałych, a jego wyliczenia są po prostu hashami, więc wszystko, co pojawi się w CoffeeScript, będzie miało podobny kształt. Dla wyliczenia CS, po prostu buduję skrót: @Colors = Red: 1, Blue: 2 – egoodberry
Chciałem się upewnić, że czegoś mi nie brakuje. Dzięki! – finneycanhelp