“我注意到 xxxx 中的程序员倾向于过度使用继承,可能是因为这是在该语言中扩展代码的唯一合理方法。扩展代码的更好和更通用的方法通常是使用钩子(参见 Apache 的模块 API,[ cf. Drupal 我可能会添加])。
已经看了一段时间,没有看到 OCaml 文档中其他地方重复出现的“钩子”一词。
OCaml 中是否对此有一些语言支持?为我指明正确的方向。我想要某种现有的类(所有实例)托管和回调,或者甚至不想要,模块可以以某种方式实现挂钩吗?
谢谢!
我会将其视为教程作者的临时个人意见。钩子不是 OCaml 对象设计的一部分。(在我个人看来,钩子比继承要糟糕得多。)
Apache 文档中对hook的描述是:
通常,钩子函数是 Apache 在处理请求期间的某个时间点调用的函数。模块可以提供被调用的函数,并指定它们与其他模块相比何时被调用。
更通用的术语是回调函数;像 C# 这样的语言有特殊的回调对象,称为委托,因为它们不将函数视为其语言中的(好)一等公民。在像OCaml这样的函数式语言中,函数与其他值没有什么不同,因此您可以像传递任何整数值一样传递它们,而无需指针等。这使得用这些语言编写回调函数变得如此自然,以至于他们的程序员甚至不需要一个花哨的名字。;)
事实上,OCaml 的标准库有许多高阶函数,它们以其他函数作为参数。下面是一个例子:
List.iter print_endline ["higher"; "order"; "function"]
该List.iter
函数将该print_endline
函数作为“回调”参数并将其应用于第二个参数(字符串列表)的每个元素。由于 OCaml 允许函数具有副作用,您甚至可以提供一个函数来List.iter
修改程序中其他地方的一些引用。