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

时间:2016-04-21 01:57:43

标签: 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

哪个效果很好

MyList.length([1, 2, 3, 4])
// 4

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

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

(小方问题)

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

1 个答案:

答案 0 :(得分:4)

它使用名为pattern matching的内容来选择正确的功能。所以它检查第一个参数是否为空列表,如果是,它将使用第一个函数,如果不是,它将使用第二个。你可以阅读它here

  • list(它不是一个数组)和计数器没有变异。您只需为每个函数调用使用不同的值。以下是它的工作原理:

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

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

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

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

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

如您所见,没有变异进行,并且该过程称为recursion