gpt4 book ai didi

Elixir:如何处理最后没有的默认参数?

转载 作者:行者123 更新时间:2023-12-03 13:49:54 25 4
gpt4 key购买 nike

当我运行以下 Elixir 脚本时,它会打印出 {"K", "Y", "L"} .

defmodule MyMod do
def make_tuple(a \\ "X", b \\ "Y", c) do
{a, b, c}
end
end

IO.inspect(MyMod.make_tuple("K", "L"))
为什么不输出 {"X", "K", "L"} ?这种行为背后的机制是什么?

最佳答案

你是对的:Elixir 使用提供的任何“多余”参数来覆盖函数的部分或全部参数的默认值,从左到右填充。我对此的理解来自 Dave Thomas 的 Programming Elixir 1.6 一书。
诀窍在于,对于具有默认参数的函数,编译器实际上会生成多个函数。像这样定义的函数:

defmodule Example do 
def func(p1, p2 \\ 2, p3 \\ 3, p4) do
IO.inspect [p1, p2, p3, p4]
end
end
实际上被编译成一个看起来像这样的模块:
defmodule Example do 
def func(p1, p4) do
func(p1, 2, 3, p4)
end

def func(p1, p2, p4) do
func(p1, p2, 3, p4)
end

def func(p1, p2, p3, p4) do
IO.inspect [p1, p2, p3, p4]
end
end
顺便说一句,你可以通过使用模块的“魔法” module_info/0 来看到这一点。功能,例如 Example.module_info() .
使用一些示例值调用您的函数将帮助您了解它们的解释方式,并且可能会有一些惊喜。
Example.func("a", "b")           # => ["a",2,3,"b"]

Example.func("a", "b", "c") # => ["a","b",3,"c"] <--- !!!

Example.func("a", "b", "c", "d") # => ["a","b","c","d"]
使用这样的函数可能更容易看到这种行为:
def func(p1 \\ 1, p2 \\ 2) do 
IO.inspect [p1, p2]
end
并且只提供了 1 个参数来调用它。它将使用左侧提供的参数;右边的默认值仍然被使用:
func("a")    #  =>  ["a", 2]
我同意当函数具有不在参数列表末尾的可选参数时,事情确实会变得困惑。

关于Elixir:如何处理最后没有的默认参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64500059/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com