将函数作为参数传递给其他函数的重点是什么?

时间:2017-09-13 21:11:44

标签: language-concepts

这是一个相当普遍的问题,并不是针对任何一种语言的。我不太明白将函数作为参数传递给另一个函数的重点。我理解,如果一个函数,比如foo1()需要使用另一个函数foo2()返回的某些结果,那么为什么不能将foo2()返回/更新的值传递给{ {1}}原样?或者在另一种情况下,为什么在foo1()内调用foo2()并在其中使用其结果? 当foo1()作为参数传递给foo2()时,会发生什么?在foo1()之前执行了foo2()吗?

3 个答案:

答案 0 :(得分:2)

一般来说,在需要对foo2进行多次评估的情况下,您会将函数foo1传递给函数foo2,而您可能事先并不知道哪些参数会用于foo2的每次通话,因此您无法提前自己执行通话。

我认为列表上的sort()函数/方法可能是最好的具体示例。考虑人员列表 - 您可能合理地希望按名称按字母顺序对其进行排序,或按年龄或按给定点的地理距离或许多其他可能的顺序对其进行数字排序。将每个这样的排序作为内置选项包含在sort()中是不切实际的:语言采用的通常方法是允许调用者提供函数作为参数,定义列表项之间的顺序

答案 1 :(得分:0)

原因有很多:

依赖注入:如果你传递的方法在生产中将使用数据库调用,并且你使用不同的参数,你可以在单元测试时用一些模拟代替它。

映射,过滤,缩小:您可以将相同的方法应用于参数列表,进行映射,过滤或减少参数。

答案 2 :(得分:0)

通常提供回调,或者从实现中分离接口。查看以下内容:

    1.依赖注入, 2.回调, 3.匿名函数(又名Lambdas), 4. PIMPL 等等

    看一下这本书在用C开发TDD时广泛使用的地方: https://www.amazon.co.uk/Driven-Development-Embedded-Pragmatic-Programmers/dp/193435662X