[英]How to convert a typed definition to a typedstruct?
我正朝着在我的應用程序中定義數據結構的方向發展,我發現TypedStruct非常有用。
但是,我最近發現了一個小問題。 我不知道如何將此定義轉換為類型化結構:
@type order_info :: %{
(visible :: String.t()) => boolean,
(order_type :: String.t()) => String.t(),
(platform :: String.t()) => String.t(),
(platinum :: String.t()) => non_neg_integer,
(user :: String.t()) => %{
(ingame_name :: String.t()) => String.t(),
(status :: String.t()) => String.t()
}
}
我這里的主要問題是user
map。除了我不知道如何在 trypedstruct 中定義 typedstruct 之外,你們是怎么做到的?
order_info
typedstruct 中定義一個 map 並忽略user
map 的強制參數?user
)進入類型化結構,稱為order_info
? 在標准 Elixir 中(即沒有typed_struct
包提供的便利宏),您將定義 2 個(或更多)結構和類型,並相互引用它們,例如
defmodule User do
@type t :: %__MODULE__{
name: String.t(),
is_active: boolean()
}
defstruct name: nil, is_active: false # ... etc.
end
defmodule OrderInfo do
@type t :: %__MODULE__{
visible: boolean(),
platform: String.t(),
user: User.t()
}
# provide a simple list of keys if default values aren't needed
defstruct [:visible, :platform, :user]
end
您會注意到@type
聲明通常將自己命名為t
:這只是一個約定——即它的名稱不是強制執行的,但是在羅馬時...
typed_struct
的目標是減少樣板文件,你最終會得到這樣的東西:
defmodule User do
use TypedStruct
typedstruct do
field :name, String.t()
field :is_active, boolean(), default: false
# ... etc...
end
end
defmodule OrderInfo do
use TypedStruct
typedstruct do
field :visible, boolean()
field :platform, String.t()
field :user, User.t()
# ... etc...
end
end
語法和結果類似於Ecto
模式的聲明方式。
一個提示是,當您從映射轉移到結構時,您必須特別注意鍵的引用方式:結構始終具有原子鍵,而映射可能具有原子或字符串,因此語法可能會從foo["bar"]
到foo.bar
或foo[:bar]
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.