iT邦幫忙

2025 iThome 鐵人賽

DAY 17
0

每個 sigil 如 ~c(hello) 其實就是執行 sigil_c 函式

sigil_c(<<"hello">>, [])

<<>> 為 Binary(Bitstring),String 為 bitstring 的 UTF8 格式實現,詳細在 string 篇會說明,目前可以先記得這個函式需要這個格式就可。

自訂一個 Sigil 符號

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"

上一篇
Sigil (符咒)
系列文
通勤看手機就可讀懂的 Elixir 語言入門教學17
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言