调用具有相同名称的多定义函数时,函数如何排序

Dat*_*sik 1 elixir

大家好,我正在关注http://learnelixir.tv的截屏视频,这些视频非常棒,这是我的第一个基于函数的编程语言,但我真的很喜欢它。

我目前正在学习列表,我们制作了一个自定义长度函数,如下所示:

defmodule MyList do
    def length(list) do
        length(list, 0)
    end

    defp length([], count) do
        count
    end

    defp length([_|t], count) do
        length(t, count + 1)
    end
end
Run Code Online (Sandbox Code Playgroud)

哪个效果很好

MyList.length([1, 2, 3, 4])
// 4
Run Code Online (Sandbox Code Playgroud)

所以根据我的理解,我们最初传入了对非私有函数的第一次调用,length-private现在调用虚拟机是否正常有 2 个版本,一个接受空数组,一个接受非空数组?

为什么它不直接跳到length([], count)第一个并返回,count // 0而是转到最后一个声明的length函数,

(小题)

count 如何在 2 个私有长度函数之间共享,以及如何[_|t]改变数组并在 2 个函数之间共享它?

NoD*_*ame 5

它使用所谓的模式匹配来选择正确的函数。所以它检查第一个参数是否是一个空列表,如果是,它将使用第一个函数,如果不是,它将使用第二个。你可以在这里阅读

  • 列表(这不是一个数组)和计数器不发生变异。您只需为每个函数调用使用不同的值。这是它的工作原理:

  • 当您第一次调用您的函数时,它会在公共函数之间进行模式匹配,因为只有一个并且它匹配任何具有 1 个参数的函数调用,它会被调用。

  • 然后它length(list, 0)再次调用which 进行模式匹配,但包括私有函数,并且由于它有两个参数并且第一个不是空列表,所以它转到第三个函数。

  • 第三个函数又length再次调用该方法,但传递不同的参数,在您的示例中,这些参数是length([1,2,3], 1).

  • 它一直持续到列表为空,所以它会调用length([1,2], 2)length([1], 3)依此类推。

  • 当它调用length([], 4)第二个函数时,因为第一个参数匹配而被调用。第二个函数只返回计数器,即 4,这是您获得的最终值。

所以如你所见,没有发生变异,这个过程称为递归