OCaml中是否支持“钩子”?

问题描述:

在XXXX我ran across this statementOCaml中是否支持“钩子”?

“我已经注意到程序员往往过度使用继承, 可能是因为它在 扩展码,语言的唯一合理的方法。一个更好的,更全面的方式来扩展代码 通常使用钩子(比较Apache的模块API,[参考Drupal我可能 添加])“。

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

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

谢谢!

+1

看起来“钩子”在这里可能有很多不同的潜在定义。 – aneccodeal 2013-04-08 16:13:22

我会把这作为一个副手个人意见的教程作者。挂钩不是OCaml对象设计的一部分。 (在我的副手个人观点,钩多,不是继承糟糕得多。)

Apache documentation的描述是:

在一般情况下,一个钩子函数是一个Apache会调用在处理请求期间的某个时刻。模块可以提供被调用的函数,并指定与其他模块进行比较的时间。

更一般的术语将是回调函数;像C#这样的语言有特殊的回调对象,称为代表,因为他们不把功能当作(良好的)头等公民用他们的语言来对待。 在功能语言如OCaml中,函数与其他值没有区别,所以您可以像传递整数值一样传递它们,而不需要指针等。这使得用这些语言编写回调函数非常自然,以至于他们的程序员甚至不需要一个奇特的名字。 ;)

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

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

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