2015-04-30 14 views

Trả lời

20

Trước hết, loại được xác định với các chỉ thị @typecông theo mặc định (như trái ngược với các loại định nghĩa với @typep). Điều này có nghĩa rằng ngay cả khi một module không có thông số kỹ thuật trong đó, xác định một loại cho phép các nhà phát triển khác để sử dụng loại mà khi viết các chức năng của họ:

@doc "Computes the length of a URI." 
@spec foo(URI.t) :: non_neg_integer 
def foo(uri), do: # ... 

__MODULE__ là một hình thức đặc biệt mà mở rộng với tên mô-đun hiện như một nguyên tử (xem docs for it), vì vậy đây:

defmodule MyModule do 
    @type t :: %__MODULE__{} 
end 

sẽ định nghĩa một kiểu MyModule.t. Cách sử dụng phổ biến nhất của loại t là để đại diện cho cấu trúc và giao thức (ví dụ: Enum.t). Mẫu này cực kỳ phổ biến:

defmodule User do 
    defstruct [:name, :email] 
    @type t :: %__MODULE__{name: String.t, email: String.t} 
end 
+0

Về điều đó '@ typep' và' @ type'. Ý nghĩa của '@ opaque' hơn là gì? Tôi nghĩ rằng đó là loại riêng tư là –

+1

@KrzysztofWende '@ opaque' là công khai nhưng chúng không tiết lộ cấu trúc bên trong của loại (ví dụ, các trường trong cấu trúc không công khai nhưng kiểu' t' của cấu trúc Các kiểu '@ typep' hoàn toàn riêng tư. Có phải nó có ý nghĩa không? – whatyouhide

+0

Nó làm một phần Tại sao làm cho kiểu có thể sử dụng được nhưng không thể kiểm tra nội bộ –

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