将函数作为参数传递给其他函数有什么意义?

What's the point behind passing functions as arguments to other functions?

这是一个相当通用的问题,并不特定于任何一种语言。我不太明白将一个函数作为参数传递给另一个函数背后的意义。我明白如果一个函数,比如说,foo1() 需要使用另一个函数 foo2() 返回的一些结果,为什么 foo2() 的值 returned/updated 不能传递给 foo1()原样?或者在另一种情况下,为什么不能在 foo1() 中调用 foo2() 并在其中使用其结果? 另外,当 foo2() 作为参数传递给 foo1() 时,幕后会发生什么? foo2() 是否在 foo1() 之前执行?

一般来说,在需要多次计算 foo2 的情况下,您将函数 foo2 传递给函数 foo1 - 您可能事先不知道什么foo2的每次调用都会使用参数,所以您不可能提前自己执行调用。

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

原因有很多:

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

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

通常用于提供回调,或者将接口与实现分离。查找以下内容:

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

看看这本书,它广泛用于使用 C 开发 TDD: https://www.amazon.co.uk/Driven-Development-Embedded-Pragmatic-Programmers/dp/193435662X