Elixir 是 動態型別 + 強型別
也就是不必為變數規定型別,處理不同型別的資料時不會幫我們自動處理。
這邊帶大家介紹這系列常用到的型別與要注意的點
我們在 iex
裡面進行
打開 iex
iex
向前一篇最後練習的一樣,我們每一行送出之後都會直接執行,回傳結果
iex> 1 + 1
2
Elixir 裡面定義變數不需要先宣告,直接訂下變數與它的值即可
name = "強哥"
通常變數在 elixir 裡面慣例都是使用 snake case
new_price = 3
a_very_long_variable = "很長的變數"
"我是字串"
最常用的大概是字串吧,就是文字拉,在 elixir 裡面我們的字串是用兩個 "
包起來,這邊要注意的是要用雙引號哦!
知道一下就好,用單引號(
'
)的話是 用文字表示的 串列(List) ,這個系列先記得不能跟字串混用即可
我們可以用 <>
來做字串相接
iex> "foo" <> "bar"
"foobar"
多行字串
"""
第一行
第二行
第三行
"""
字串我們常常使用 String
模組來操作
例如
split
iex> String.split("foo bar")
["foo", "bar"]
downcase
iex> String.downcase("ELIxir")
"elixir"
像大部分的程式語言一樣都有做加減乘除
唯一要注意的是 /
,用 /
除過的結果會變成有小數點的 float
而不是 integer
,
如果要維持 integer
可以使用 div
方法
iex> div(5, 2)
2
String
模組跟字串一樣,也有提供一個叫 String
的模組來放操作 string
的方法們
如果需要轉換型別,通常模組內都會有相對應的方法可以使用
這邊列出常用的
iex> String.to_integer("3310")
3310
iex> Integer.to_string(1234)
"1234"
Elixir 跟很多語言一樣有 true
與 false
iex> 3 > 2
true
iex> 3 < 2
false
iex> 3 >= 2
true
iex> 3 <= 2
false
iex> 3 == 3
true
iex> 3 != 2
true
nil 是空值的意思
常常在使用方法找不到結果的時候拿到,例如
iex> String.at("abc", 6)
nil
這個 String 模組的方法 at 要找 "abc" 裡面的第 7 個字母(從0開始算),但是 "abc" 只有三個,通常這種尋找的方法找不到的話都會回傳空值 nil。
在 Elixir 裡,只有 false 與 nil 在判斷式裡是 falsy(否定),true 與 其他任何值(包含 0 與空字串) 都是 truthy(肯定)
if nil do "不會執行這邊" else "因為 nil 是 falsy,這邊會被執行" end
atom 長這樣 用 :
開頭的英文字
:atom
:another_atom
atom 是常數
他的名稱就代表他的值
可以想像成像文字模式的數字
iex> :foo == :bar
false
其實 Elixir 裡的 true, false, nil 都是 atom
iex> :false == false true
另外後面會提到的 Module 名稱也是
之後在寫 elixir 會有發現有很多方法如果執行成功的話會回傳 atom :ok
失敗的時候回回傳 atom :error
Elixir 的 list 可以放進不同型態的值
[1, "foo", :bar]
串接 list
iex> [1, 2, 3] ++ [4, 5, 6]
[1, 2, 3, 4, 5, 6]
Elixir 一樣也有 List 模組 提供操作 list 的方法們
使用 List.last
取得 list 內的最後一個
iex> List.last([1, 2, 3])
3
長這樣
{:ok, 3}
他跟 list 相當像但修改時比較沒效率,不過我們先不用擔心這些
tuple 常常用在方法的回傳值,尤其是有用到外部資源,如資料庫或檔案的方法
iex> File.read("存在的/檔案/路徑")
{:ok, "檔案內容"}
iex> File.read("不存在的/檔案/路徑")
{:error, :enoent}
map 用來放有標籤內容相對的資料,例如
%{"名稱" => "強尼"}
如果 key 是 atom 的話,可以被簡寫成
%{name: "John"}
大部分需要有鍵值對應的資料都是用這個格式存
從 map 裡面刪除指定 key 的值
iex> Map.delete(%{a: 1, b: 2}, :a)
%{b: 2}
合併兩個 map
iex> Map.merge(%{a: 1, b: 2}, %{a: 3, d: 4})
%{a: 3, b: 2, d: 4}
其實 keyword list 就是 list 與 tuple 的組合
在 list 裡面裝由 一個 atom 與 一個內容組成的 tuple 們
[{:foo, :bar}, {:name, "Jack"}, {:name, "Dan"}]
會被簡寫成
[foo: :bar, name: "Jack", name: "Dan"]
跟 map 很像但是 keyword list 的 key 值可以重複,有順序關西,key 必須是 atom。
常常在需要額外選像當變數的方法變數裡面用到。
從 Keyword list 裡面取出 key 為 :a 的值
Keyword.get([a: 1], :a)
1
列舉 (enumerable)
這邊要特別提一下 Enum 模組,他算是最常用的內建模組了,它內建了操作多個資料集合的各種方法,可以用在 List, Map, Keyword list
使用 Enum.sort
來排序 list
iex> Enum.sort([4, 1, 3, 2])
[1, 2, 3, 4]