在OCaml中是否支持“钩子”?

时间:2013-04-08 04:30:45

标签: object hook ocaml

ran across this statement

  

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

已经看了一会儿,还没有看到OCaml docs中其他地方重复的术语“钩子”。

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

谢谢!

2 个答案:

答案 0 :(得分:3)

我认为这是教程作者的个人观点。钩子不是OCaml对象设计的一部分。 (根据我个人的观点,钩子比继承更糟糕。)

答案 1 :(得分:0)

Apache documentation hook 的说明是:

  

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

更通用的术语是回调函数;像C#这样的语言有一些叫做代表的特殊Callback-Objects,因为它们不会将函数视为其语言中的(好)一等公民。 在像 OCaml 这样的函数式语言中,函数与其他值没有区别,因此您可以像任何整数值一样传递它们而无需指针等。这使得用这些语言编写回调函数非常自然,以至于他们的程序员甚至不需要花哨的名字。 ;)

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

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

List.iter函数将print_endline函数作为“callback”参数,并将其应用于第二个参数的每个元素(字符串列表)。由于OCaml允许函数产生副作用,你甚至可以为List.iter提供一个功能,修改程序中其他地方的某些引用。