这是一个相当通用的问题,并不特定于任何一种语言。我不太明白将一个函数作为参数传递给另一个函数背后的意义。我知道,如果一个函数foo1()
需要使用另一个函数返回的一些结果foo2()
,为什么foo2()
返回/更新的值不能按原样传递给foo1()
?或者在另一种情况下,为什么不能在foo1()
内调用foo2()
,并在其中使用其结果? 另外,当foo2()
作为参数传递给foo1()
时,引擎盖下会发生什么?foo2()
是在foo1()
之前执行的吗?
一般来说,在需要对foo2
进行多次评估的情况下,您将函数foo2
传递给函数foo1
- 并且您可能事先不知道每次调用foo2
将使用哪些参数,因此您不可能提前自己执行调用。
我认为列表中的sort()
函数/方法可能是最好的具体例子。 考虑一个人员列表 - 您可能合理地希望按姓名的字母顺序、年龄的数字顺序、与给定点的地理距离或许多其他可能的顺序对他们进行排序。 将每个这样的排序都作为内置选项包含在sort()
中是不切实际的:语言通常采用的方法是允许调用者提供一个函数作为参数,该函数定义了列表项之间的顺序。
原因有很多:
依赖注入:如果您传递了一个在生产中将使用数据库调用的方法,并且您将其与不同的参数一起使用,则可以在单元测试时用一些模拟替换它。
映射、过滤、减少:您可以将相同的方法应用于参数列表,以映射、过滤或减少它。
通常用于提供回调,或将接口与实现分开。 查找以下内容:
- 1. 依赖注入, 2. 回调, 3. 匿名函数(又名 Lambdas), 4. 痘痘 等等
看看这本书,它被广泛用于用C开发TDD: https://www.amazon.co.uk/Driven-Development-Embedded-Pragmatic-Programmers/dp/193435662X