模組
再前幾個章節,我們有介紹到模組函式的用法。在這篇文章,彙整裡一下模組的一些細節內容。
因為Elixir是一個函數式的語言,因此Module就可以想像成是對應到OOP裡面的Class是進行邏輯的封裝的。
因此在使用上,也有跟OOP相似的地方。
iex(1)> defmodule Test do
def f1 do
f2()
end
def f2 do
IO.inspect "test"
end
end
iex(2)> Test.f1
"test"
"test"
iex(1)> defmodule Test do
@api_url "http://www.hong-teng.com"
def f1 do
IO.inspect @api_url
end
end
不過值得注意的是,模組屬性是無法進行修改的,因為資料具有不變性。
所以他其實是類似OOP class的靜態變數,不過Elixir模組函式,是無法進行外部存取的,只能透過模組方法,來進行存取。
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}