簡體   English   中英

如何將類型化定義轉換為類型化結構?

[英]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 之外,你們是怎么做到的?

  1. 您是否只是在order_info typedstruct 中定義一個 map 並忽略user map 的強制參數?
  2. 您是否創建了另一個類型化結構(稱為user )進入類型化結構,稱為order_info
  3. Elixir中的標准選項是什么?

在標准 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.barfoo[:bar]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM