iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 12
1
Modern Web

用Elixir學習後端煉金術系列 第 12

Day 12 |> 模組 (Modules) 與結構 (Structs)

  • 分享至 

  • xImage
  •  

模組
再前幾個章節,我們有介紹到模組函式的用法。在這篇文章,彙整裡一下模組的一些細節內容。

因為Elixir是一個函數式的語言,因此Module就可以想像成是對應到OOP裡面的Class是進行邏輯的封裝的。
因此在使用上,也有跟OOP相似的地方。

  1. 私有函式(defp)
    模組中以defp定義的函式是私有函式,只能被同個模組的其它函式呼叫。
iex(1)> defmodule Test do
  def f1 do
    f2()
  end
  def f2 do
    IO.inspect "test"
  end
end
iex(2)> Test.f1
"test"
"test"
  1. 模組屬性(attributes)
    在模組中用 @開頭可以宣告模組屬性,並可以給預設值。
iex(1)> defmodule Test do
  @api_url "http://www.hong-teng.com"
  def f1 do
    IO.inspect @api_url
  end
end

不過值得注意的是,模組屬性是無法進行修改的,因為資料具有不變性。
所以他其實是類似OOP class的靜態變數,不過Elixir模組函式,是無法進行外部存取的,只能透過模組方法,來進行存取。

  1. 結構 (struct)
    通過defstruct,可以宣告模組結構並對其初始值進行宣告。
iex(1)> defmodule Test do
  defstruct [name: "jack", age: 18]
  def f1 do
  end
  def f2 do
  end
end

進行上面的宣告後,就可以以該結構的宣告來建立資料了(類似OOP中用class new出物件的感覺)

iex> %Test{}
%Test{age: 18, name: "jack"}
iex> %Test{job: "teacher"}
** (KeyError) key :job not found
    expanding struct: Test.__struct__/1
    iex:3: (file)
iex> test = %Test{age: 27}
%Test{age: 27, name: "jack"}

由此方法創建出來的Struct其實擁有跟Map一樣的性質,只是在其底下的__struct__(不會顯示)的key對應的值會是該結構的模組名稱,因此在Map模組下的函式都是可以使用的。

iex> test.__struct__
Test

若是用以下的寫法,則不會給定name的預設值,struct在創建時若沒給值,預設則會nil。

iex(1)> defmodule Test do
  defstruct [:name, age: 18]
end
iex(2)> test = %Test{}
%Test{age: 18, name: nil}

上一篇
Day 11 |> 完成1/3了,中場休息 & 書單推薦
下一篇
Day 13 |> 流程控制 (Control Flow)
系列文
用Elixir學習後端煉金術30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言