“我注意到xxxx中的程序员倾向于过度使用继承, 可能是因为它是扩展代码的唯一合理方式 那种语言。扩展代码的更好,更通用的方法是 通常使用钩子(参见Apache的模块API,[参考Drupal我可能会 添加])。“
已经看了一会儿,还没有看到OCaml docs中其他地方重复的术语“钩子”。
在OCaml中是否有一些语言支持?指出我正确的方向。我想要一些现存的类(所有实例)托管和回调,或者甚至不是,模块可以以某种方式实现钩子吗?
谢谢!
答案 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
提供一个功能,修改程序中其他地方的某些引用。