Trước hết, loại được xác định với các chỉ thị @type
là cô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
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à –
@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
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ộ –