【问题标题】:Pattern matching and default parameters模式匹配和默认参数
【发布时间】:2016-12-13 16:54:36
【问题描述】:

我是 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")?这也符合参数中定义的模式。我在文档中寻找了深入的解释,但找不到任何东西。

想了一会儿,我怀疑它是这样工作的:

  1. “a”与 p1 匹配
  2. “b”与 p2 匹配
  3. “c”与 p3 不匹配,因为那样会出现不匹配。所以就跳过了,p3得到默认值,也就是3
  4. “c”与 p4 匹配

有人可以确认/解释吗?

编辑:修正错别字

【问题讨论】:

    标签: elixir


    【解决方案1】:

    找不到很好的参考,但我的理解是它试图从左到右匹配。所以 a 和 b 匹配,p3 不匹配 c 因为 p4 没有值,所以下一个选项是 p4 和 c

    【讨论】:

      【解决方案2】:

      使用您的示例:

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

      如果你编译你的代码并输入h DefaultParams.func和tab,它会显示给你

      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]
      

      【讨论】:

      • 啊,很有启发性。谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-15
      • 2021-12-27
      • 1970-01-01
      • 2011-07-15
      • 1970-01-01
      相关资源
      最近更新 更多