W3Cschool
恭喜您成為首批注冊用戶
獲得88經驗值獎勵
Elixir中的具名函數也支持默認參數:
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
任何表達式都可以作為默認值,但它在函數定義時不會執(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
當帶默認值的函數有多個從句時,就需要創(chuàng)建一個不包含函數內容的函數頭來聲明默認值:
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
當使用默認值時,我們要當心函數定義的重疊:
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
編譯器告訴我們當用兩個參數調用join函數時,總會使用第一個join函數定義,而第二個定義只有當傳遞三個參數時才會被調用:
$ iex concat.exs
iex> Concat.join "Hello", "world"
***First join
"Helloworld"
iex> Concat.join "Hello", "world", "_"
***Second join
"Hello_world"
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: