iT邦幫忙

2025 iThome 鐵人賽

DAY 5
0

函式呼叫 1

import 模組

在第一篇提到過,定義並呼叫函式如下

defmodule Say do
  def hi(name) do
    IO.puts("Hi! #{name}.")
  end
end

Say.hi("Bily")
#=> Hi! Bily.

在模組內可以直接呼叫函式名,不用再加模組名

defmodule Say do
  def hi(name) do
    IO.puts("Hi! #{name}.")
  end
  
  def hix3(name) do
    hi(name) # 在這邊可直接呼叫 hi
    hi(name)
    hi(name)
  end
end

若是在別的模組,可以使用 import

defmodule Say do
  def hi(name) do
    IO.puts("Hi! #{name}.")
  end
end

defmodule GreetEddy do
  import Say

  def hi do
    hi("Eddy") # import 後,在這個模組可以直接使用
  end
end

function clause (函式子句, 同名函式)

在 Elixir 能帶值的地方就有 pattern matching
呼叫函式也不例外

module Say do
  def hi("Jack") do
    "Hi, admin Jack"
  end
  def hi(name) do
    "Hi, #{name}"
  end
end

使用多個同名函式,在呼叫時會依順序從上到下嘗試
若呼叫 hi("Jack"),將會在第一個匹配成功,後續就不再執行

使用函式子句重構第一篇

defmodule GuessGame do
  def play do
    number = Enum.random(1..100)
    IO.puts("我想了一個 1-100 的數字,請猜猜看!")
    guess_loop(number)
  end

  defp guess_loop(number) do
    input =
      IO.gets("請輸入你的猜測: ")
      |> String.trim()
      |> String.to_integer()

    case input do
      ^number ->
        IO.puts("恭喜猜中!")

      guess when guess < number ->
        IO.puts("太小了!")
        guess_loop(number)

      guess when guess > number ->
        IO.puts("太大了!")
        guess_loop(number)
    end
  end
end
defmodule GuessGame do
  def play do
    number = Enum.random(1..100)
    IO.puts("我想了一個 1-100 的數字,請猜猜看!")
    
    guess(number, get_input())
  end
  
  defp guess(number, number) do
    IO.puts("恭喜猜中!")
  end
  
  defp guess(number, guess) when guess < number do
    IO.puts("太小了!")
    guess(number, get_input())
  end
  
  defp guess(number, guess) when guess > number do
    IO.puts("太大了!")
    guess(number, get_input())
  end
  
  defp get_input do
    IO.gets("請輸入你的猜測: ")
      |> String.trim()
      |> String.to_integer()
  end
end

如果函式有更短的函式主體,可以把 def 使用原本的語法來呼叫

module Say do
  def hi("Jack"), do: "Hi, admin Jack"
  def hi("José"), do: "Hi, creater of Elixir"
  def hi(name), do: name
end

為什麼可以改寫這樣後面的 do end 語法糖,這邊先記住這個寫法即可,要記得 ,


上一篇
複合型態 Map 與 Tuple
下一篇
函式 2
系列文
通勤看手機就可讀懂的 Elixir 語言入門教學10
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言