每個 sigil 如 ~c(hello)
其實就是執行 sigil_c 函式
sigil_c(<<"hello">>, [])
<<>>
為 Binary(Bitstring),String 為 bitstring 的 UTF8 格式實現,詳細在 string 篇會說明,目前可以先記得這個函式需要這個格式就可。
defmodule WeekDay do
def sigil_WD(nth_day, []) do
nth_day = String.to_integer(nth_day)
case nth_day do
1 -> "Monday"
2 -> "Tuesday"
3 -> "Wednesday"
4 -> "Thursday"
5 -> "Friday"
6 -> "Saturday"
7 -> "Sunday"
_ -> raise("Invalid day")
end
end
end
這樣一來
在 import WeekDay 模組之後
就可以使用 ~WD(1)
來產生 "Monday"
import WeekDay
~WD(1)
#=> "Monday"
~WD(2)
#=> "Tuesday"
我們也可以增加一個同名函式,來處理如果禮拜日才是第一天的情況
def sigil_WD(nth_day, [?s])
defmodule WeekDay do
def sigil_WD(nth_day, []) do
nth_day
|> String.to_integer()
|> to_day
end
def sigil_WD(nth_day, [?s]) do
nth_day
|> String.to_integer()
|> Kernel.-(1)
|> rem(7)
|> to_day
end
defp to_day(nth_day) do
~w(Monday Tuesday Wednesday Thursday Friday Saturday Sunday)
|> Enum.at(nth_day - 1)
end
end
這樣一來就可以使用 ~WD(1)s
import WeekDay
~WD(1)s
#=> "Sunday"