tôi rất không đồng ý với tuyên bố rằng Enums là vô ích do tính chất động của Javascript hoặc Enums là ít băm được tôn vinh hơn.
Trích dẫn Wikipedia: "Biến đã được khai báo là có loại liệt kê có thể được gán bất kỳ điều tra nào làm giá trị." Và chỉ những điều tra viên mới có thể làm giá trị.
Coffeescript có thể dễ dàng và cú pháp làm hài lòng thi đua một Enum. Bao gồm xử lý lỗi trên các giá trị điều tra không hợp lệ (mặc dù chỉ trong thời gian chạy)
Tôi đã tạo một ví dụ chủ yếu là chức năng và sử dụng gọi lại vô danh chức năng như một phương tiện giao - về cơ bản thay thế toán tử gán "=" cho Quản trị viên chức năng Coffeescripts "->". Nó làm cho đoạn mã dày đặc nhất trong cuốn sách của tôi. Tuy nhiên một cách tiếp cận dựa trên lớp học hơn là chắc chắn có thể.
#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 ->
Và đây là đoạn code để tạo ra một Enum (bạn cần phải đặt này trên đầu của mã nếu bạn muốn chạy nó. Chỉ muốn hiển thị các mã sử dụng trước khi mã thực hiện
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
Rõ ràng sẽ đẹp hơn nhiều nếu Coffeescript có macro cú pháp. Vì vậy, chúng ta có thể viết
Enum httpcodes
ok: 200
badrequest: 400
và
chrome = httpcodes 'ok
#or
chrome := 'ok
Chính xác là bạn đang tìm kiếm điều gì? JavaScript không có hằng số và enums của nó chỉ là băm, vì vậy bất cứ điều gì bạn đưa ra trong CoffeeScript với sẽ được định dạng tương tự. Đối với enums CS, tôi chỉ xây dựng một băm như vậy: @Colors = Red: 1, Blue: 2 – egoodberry
Tôi muốn chắc chắn rằng tôi đã không bỏ lỡ một cái gì đó. Cảm ơn! – finneycanhelp