Có sử dụng @enum
cách duy nhất để khai báo kiểu dữ liệu Julia Enum? Nếu vậy tại sao?Các cách khác nhau để khai báo kiểu dữ liệu Enum trong Julia-Lang
Trả lời
Đó là cách duy nhất (dễ), vâng. Câu trả lời, thường xuyên (hoặc, thay vào đó, luôn luôn) trong Julia, có thể được tìm thấy bằng cách nhìn vào source code. Điều này có thể là một chút đáng sợ lúc đầu, nhưng bạn đã quen với nó sau một thời gian!
Thông thường để tạo đối tượng của một loại nhất định, bạn gọi hàm tạo của kiểu. Vì vậy, bạn có thể mong đợi để có thể làm
Enum(...)
và tạo một đối tượng kiểu Enum
.
Trong trường hợp này, tuy nhiên, Enum
là loại trừu tượng, vì vậy bạn không thể làm điều đó.
@enum
làm gì sau đó? Ví dụ từ manual là
julia> @enum FRUIT apple=1 orange=2 kiwi=3
Điều này thực sự tạo ra một loại hoàn toàn mới, gọi FRUIT
, đó là một subtype của Enum
, và các đối tượng của loại hình đó gọi là apple
, orange
và kiwi
, được chuyển đổi sang những số bằng cách gọi Int(apple)
v.v. Điều này được thực hiện bằng cách tạo mã Julia để làm như vậy, bên trong macro.
Về nguyên tắc, bạn có thể tự mình làm tất cả công việc mà macro thực hiện, nhưng macro ở đó để làm cho cuộc sống của chúng ta dễ dàng hơn!
... và sau đó có loại lạm dụng cách làm việc đó; mà tôi stumbled khi khi nghĩ đến việc loại như tên cho bộ:
typealias Sunday Val{:Sunday}
typealias Monday Val{:Monday}
typealias Tuesday Val{:Tuesday}
typealias Wednesday Val{:Wednesday}
typealias Thursday Val{:Thursday}
typealias Friday Val{:Friday}
typealias Saturday Val{:Saturday}
typealias Days Union{
Type{Sunday},
Type{Monday},
Type{Tuesday},
Type{Wednesday},
Type{Thursday},
Type{Friday},
Type{Saturday}
}
function daynumber(d::Days)
if d == Sunday return 0
elseif d == Monday return 1
elseif d == Tuesday return 2
elseif d == Wednesday return 3
elseif d == Thursday return 4
elseif d == Friday return 5
elseif d == Wednesday return 6
end
-1
end
> daynumber(Friday)
5
> daynumber(:Friday)
> MethodError:`daynumber` has no method matching (::Symbol)
Lưu ý rằng việc sử dụng các biểu tượng chỉ là một chút xinh đẹp của phản xạ, và hoàn toàn không cần thiết. Bạn có thể đặt bất kỳ thứ gì vào đó và sau đó khôi phục thông qua kiểm tra loại
> x = Saturday.parameters[1]
:Saturday
> typeof(x)
Symbol
> eval(x) == Saturday
true
Tôi chắc chắn tài liệu này đề xuất rõ ràng against này. Tuy nhiên @code_warntype không đặc biệt balk tại cấu trúc này.
Trong các thuật ngữ lý thuyết đã đặt, mỗi bí danh mỗi ngày là một kiểu đơn lẻ và do đó là tên cho một tập hợp chính xác một phần tử. "Liên minh" của "Type" s sau đó là liên minh lý thuyết tập hợp các bộ phần tử đơn, tạo thành kiểu tập hợp hữu hạn được liệt kê. hơn
... nhưng cách loại mangling làm liệt kê
abstract Fruits{N} <: Enum
immutable Apples <: Fruits{1} end
immutable Oranges <: Fruits{2} end
immutable Bananas <: Fruits{3} end
fruitsalad{N}(x::Fruits{N}) = N
> anorange = Oranges()
> fruitsalad(anorange)
2
Again @code_warntype dường như không quan tâm này ở tất cả. Cuối cùng một kỹ thuật mới nhất mà còn cung cấp một không gian tên bảo vệ cho việc đếm
immutable Fruits{N} <: Enum
apples::Fruits
bananas::Fruits
oranges::Fruits
function Base.call(::Type{Fruits})
new{"anything"}(
Fruits{"crunchy"}(),
Fruits{"mushy"}(),
Fruits{"tangy"}()
)
end
function Base.call{N}(::Type{Fruits{N}})
if N != "crunchy" && N != "mushy" && N != "tangy"
error("Invalid enumeration parameter")
end
new{N}()
end
end
fruitsalad{N}(x::Fruits{N}) = N
> fruitsalad(Fruits().apples)
"crunchy"
Trong ví dụ cuối cùng này để truy cập vào bất động sản thuận tiện cung cấp cho một thể hiện của một loại trái cây cụ thể chúng tôi phải đầu tiên nhanh chóng các loại trái cây nói chung loại. Trong cách nói của thiết kế hướng đối tượng, Julia không có tính chất tĩnh của các kiểu.Các thuộc tính của các kiểu chỉ có sẵn khi một cá thể rõ ràng của kiểu đó đã được xây dựng. Ý nghĩ là bất kỳ thứ gì có sẵn về mặt tĩnh về một kiểu cụ thể sẽ được biểu diễn dưới dạng một số phương thức nạp chồng.
- 1. Làm thế nào để khai báo một loạt các kiểu dữ liệu khác nhau
- 2. Enum kiểu dữ liệu trong Cassandra
- 3. Tại sao các hằng số enum phải được khai báo trước bất kỳ biến nào khác và khai báo phương thức trong một kiểu enum?
- 4. Làm cách nào để khai báo kiểu dữ liệu Hệ thống trong UWP/RT XAML?
- 5. Xử lý dữ liệu gấu trúc theo kiểu khai báo
- 6. Có thể khai báo hai biến của các kiểu khác nhau trong vòng lặp for không?
- 7. Khai báo hằng bên trong enum
- 8. Cách bản địa hóa các thông báo kiểu dữ liệu
- 9. Các cơ sở dữ liệu khác nhau có sử dụng báo giá tên khác nhau không?
- 10. Tên xung đột giữa các nhãn trường của các kiểu dữ liệu khác nhau trong Haskell
- 11. Python phân biệt giữa các kiểu dữ liệu khác nhau như thế nào?
- 12. Khai báo một enum trong một lớp
- 13. Cách di chuyển dữ liệu giữa 2 bảng/với các cột khác nhau trong cơ sở dữ liệu khác nhau
- 14. Khai báo biến enum trong Java bean
- 15. Lưu trữ các kiểu dữ liệu khác nhau trong một mảng NumPy?
- 16. Trả về kiểu dữ liệu khác nhau tùy thuộc vào dữ liệu (C++)
- 17. sự khác nhau giữa các kiểu dữ liệu thô dài và dài trong Oracle là gì?
- 18. Sự khác nhau giữa các kiểu dữ liệu BLOB và TEXT trong MySQL là gì?
- 19. Lưu các khung dữ liệu Spark với các kiểu dữ liệu người dùng lồng nhau
- 20. Sự khác nhau giữa kiểu Generic và Object trong khai báo phương thức là gì?
- 21. Tìm dữ liệu giống nhau trong hai Khung dữ liệu có các hình dạng khác nhau
- 22. C#: Khai báo biến hằng số cho kiểu dữ liệu để sử dụng
- 23. Chuyển tiếp khai báo enum trong Mục tiêu-C
- 24. Cách khai báo các thành phần lồng nhau trong Angular2
- 25. Overplotting từ các khung dữ liệu khác nhau trong ggplot2
- 26. Sự khác nhau giữa kiểu dữ liệu-dojo và dojotype là gì?
- 27. Quy tắc chung để so sánh các loại dữ liệu khác nhau trong C là gì?
- 28. C#: Khai báo và sử dụng danh sách các lớp chung với các kiểu khác nhau, làm thế nào?
- 29. Django với Gunicorn các cách khác nhau để triển khai
- 30. Haskell: Khai báo kiểu trong `where`
Trong ngôn ngữ nào? Trong * Julia *? Đọc tài liệu ... – m02ph3u5