【问题标题】:How are functions ordered when calling multi defined functions with the same name调用具有相同名称的多个定义函数时函数如何排序
【发布时间】:2016-04-21 11:03:49
【问题描述】:

大家好,我正在关注来自 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 函数,

(小问题)

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

【问题讨论】:

    标签: elixir


    【解决方案1】:

    它使用所谓的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

    【讨论】:

      猜你喜欢
      • 2011-09-15
      • 1970-01-01
      • 2011-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多