gpt4 book ai didi

elixir - 模式匹配和默认参数

转载 作者:行者123 更新时间:2023-12-01 23:04:43 25 4
gpt4 key购买 nike

我是 Elixir 的新手。我有这个代码:

defmodule DefaultParams do
def func(p1, p2 \\ 2, p3 \\ 3, p4) do
IO.inspect [p1, p2, p3, p4]
end
end

使用此代码,我执行以下操作:
DefaultParams.func("a", "b") #=> ("a", 2, 3, "b")

我明白为什么它会这样工作:因为模式匹配。 Elixir 尝试将提供的参数与函数定义中定义的参数进行匹配。

但是,我不明白这一点:
DefaultParams.func("a", "b", "c") #=> ("a", "b", 3, "c")

为什么输出不是 ("a", 2, "b", "c") ?这也符合参数中定义的模式。我在文档中寻找了深入的解释,但找不到任何东西。

想了一会儿,我怀疑它是这样工作的:
  • "a"匹配 p1
  • "b"匹配 p2
  • "c"与 p3 不匹配,因为那样会出现不匹配。所以跳过了,p3得到默认值,即3
  • "c"匹配 p4

  • 有人可以确认/解释吗?

    编辑:修正错别字

    最佳答案

    使用您的示例:

    def func(p1, p2 \\ 2, p3 \\ 3, p4) do
    IO.inspect [p1, p2, p3, p4]
    end

    如果你编译你的代码并输入 h DefaultParams.functab ,它会告诉你
    iex> h DefaultParams.func
    func/2 func/3 func/4

    它实际上为您创建了 3 个函数。
    def func(p1, p4),     do: func(p1, 2,  3, p4)
    def func(p1, p2, p4), do: func(p1, p2, 3, p4)
    def func(p1, p2, p3, p4) do
    IO.inspect [p1, p2, p3, p4]
    end
    iex> func(:a, :b)         # calling func/2, which is actually func(p1, 2, 3, p4)
    [:a, 2, 3, :b]

    iex> func(:a, :b, :c) # calling func/3, which is actually func(p1, p2, 3, p4)
    [:a, :b, 3, :c]

    iex> func(:a, :b, :c, :d) # calling func/4
    [:a, :b, :c, :d]

    关于elixir - 模式匹配和默认参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38820327/

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