大家好,我只是跟随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个函数之间共享它?
答案 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