結構

結構體 在 Elixir

21 個練習

關於 結構體

結構體是一種特殊的映射,具有一組定義好的鍵。

  • 結構體提供編譯期檢查與預設值。
  • 結構體以定義它的模組命名。
  • 要定義結構體,請使用defstruct建構語法。
    • 這個建構語法通常緊接在模組定義之後。
  • defstruct 接受由原子組成的陣列(用於 nil 預設值),或關鍵字陣列(用於指定的預設值)。
    • 沒有預設值的欄位必須排在有預設值的欄位前面。
defmodule Plane do
  defstruct [:engine, wings: 2]
end

plane = %Plane{}
# => %Plane{engine: nil, wings: 2}

存取欄位與更新

  • 大多數能處理映射的函式,也能處理結構體。

  • 建議使用 靜態存取運算子.來存取結構體欄位。

  • 取得欄位值:

    plane = %Plane{}
    plane.engine
    # => nil
    Map.fetch(plane, :wings)
    # => {:ok, 2}
    
  • 更新欄位值

    plane = %Plane{}
    %{plane | wings: 4}
    # => %Plane{engine: nil, wings: 4}
    

強制初始化欄位值

  • @enforce_keys 模組屬性會建立一項執行期檢查,要求指定的欄位在建立結構體時必須初始化為非nil的值。
  • @enforce_keys 後面接著一個欄位鍵的陣列(它們是原子)。
  • 如果強制要求的鍵沒有被初始化,就會引發錯誤。
defmodule User do
  @enforce_keys [:username]
  defstruct [:username]
end

%User{}
# => (ArgumentError) the following keys must also be given when building struct User: [:username]
透過 GitHub 編輯 連結會在新視窗或分頁中開啟

學習 結構體

練習已鎖定

再解鎖 9 個練習,就能練習 結構體