Elixir 默認參數(shù)

2023-12-14 17:21 更新

Elixir中的具名函數(shù)也支持默認參數(shù):

defmodule Concat do
  def join(a, b, sep \\ " ") do
    a <> sep <> b
  end
end

IO.puts Concat.join("Hello", "world")      #=> Hello world
IO.puts Concat.join("Hello", "world", "_") #=> Hello_world

任何表達式都可以作為默認值,但它在函數(shù)定義時不會執(zhí)行;僅僅是存貯備用。每當必須使用默認值的時候,表達式才會被執(zhí)行:

defmodule DefaultTest do
  def dowork(x \\ IO.puts "hello") do
    x
  end
end
iex> DefaultTest.dowork
hello
:ok
iex> DefaultTest.dowork 123
123
iex> DefaultTest.dowork
hello
:ok

當帶默認值的函數(shù)有多個從句時,就需要創(chuàng)建一個不包含函數(shù)內(nèi)容的函數(shù)頭來聲明默認值:

defmodule Concat do
  def join(a, b \\ nil, sep \\ " ")

  def join(a, b, _sep) when is_nil(b) do
    a
  end

  def join(a, b, sep) do
    a <> sep <> b
  end
end

IO.puts Concat.join("Hello", "world")      #=> Hello world
IO.puts Concat.join("Hello", "world", "_") #=> Hello_world
IO.puts Concat.join("Hello")               #=> Hello

當使用默認值時,我們要當心函數(shù)定義的重疊:

defmodule Concat do
  def join(a, b) do
    IO.puts "***First join"
    a <> b
  end

  def join(a, b, sep \\ " ") do
    IO.puts "***Second join"
    a <> sep <> b
  end
end

如果我們將上述代碼保存到文件“concat.ex”中并編譯,Elixir將提出警告:

concat.ex:7: warning: this clause cannot match because a previous clause at line 2 always matches

編譯器告訴我們當用兩個參數(shù)調(diào)用join函數(shù)時,總會使用第一個join函數(shù)定義,而第二個定義只有當傳遞三個參數(shù)時才會被調(diào)用:

$ iex concat.exs
iex> Concat.join "Hello", "world"
***First join
"Helloworld"
iex> Concat.join "Hello", "world", "_"
***Second join
"Hello_world"
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號