1

遇到了这个声明

“我注意到 xxxx 中的程序员倾向于过度使用继承,可能是因为这是在该语言中扩展代码的唯一合理方法。扩展代码的更好和更通用的方法通常是使用钩子(参见 Apache 的模块 API,[ cf. Drupal 我可能会添加])。

已经看了一段时间,没有看到 OCaml 文档中其他地方重复出现的“钩子”一词。

OCaml 中是否对此有一些语言支持?为我指明正确的方向。我想要某种现有的类(所有实例)托管和回调,或者甚至不想要,模块可以以某种方式实现挂钩吗?

谢谢!

4

2 回答 2

3

我会将其视为教程作者的临时个人意见。钩子不是 OCaml 对象设计的一部分。(在我个人看来,钩子比继承要糟糕得多。)

于 2013-04-08T04:54:06.913 回答
0

Apache 文档中对hook的描述是:

通常,钩子函数是 Apache 在处理请求期间的某个时间点调用的函数。模块可以提供被调用的函数,并指定它们与其他模块相比何时被调用。

更通用的术语是回调函数;像 C# 这样的语言有特殊的回调对象,称为委托,因为它们不将函数视为其语言中的(好)一等公民。在像OCaml这样的函数式语言中,函数与其他值没有什么不同,因此您可以像传递任何整数值一样传递它们,而无需指针等。这使得用这些语言编写回调函数变得如此自然,以至于他们的程序员甚至不需要一个花哨的名字。;)

事实上,OCaml 的标准库有许多高阶函数,它们以其他函数作为参数。下面是一个例子:

List.iter print_endline ["higher"; "order"; "function"]

List.iter函数将该print_endline函数作为“回调”参数并将其应用于第二个参数(字符串列表)的每个元素。由于 OCaml 允许函数具有副作用,您甚至可以提供一个函数来List.iter修改程序中其他地方的一些引用。

于 2013-04-09T09:22:00.167 回答