2015-09-30 21 views

Trả lời

14

Đó 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

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, orangekiwi, đượ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!

2

... 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.

Các vấn đề liên quan