2013-04-08 35 views
1

在XXXX我ran across this statementOCaml中是否支持「鉤子」?

「我已經注意到程序員往往過度使用繼承, 可能是因爲它在 擴展碼,語言的唯一合理的方法。一個更好的,更全面的方式來擴展代碼 通常使用鉤子(比較Apache的模塊API,[參考Drupal我可能 添加])「。

已經找了一會兒,還沒有看到OCaml文檔中其他地方重複的術語「鉤子」。

OCaml中有這種語言支持嗎?指向正確的方向。我想要一些現存類(所有實例)的管理和回調,或者甚至沒有,模塊能否以某種方式實現一個鉤子?

謝謝!

+1

看起來「鉤子」在這裏可能有很多不同的潛在定義。 – aneccodeal 2013-04-08 16:13:22

回答

3

我會把這作爲一個副手個人意見的教程作者。掛鉤不是OCaml對象設計的一部分。 (在我的副手個人觀點,鉤多,不是繼承糟糕得多。)

0

Apache documentation的描述是:

在一般情況下,一個鉤子函數是一個Apache會調用在處理請求期間的某個時刻。模塊可以提供被調用的函數,並指定與其他模塊進行比較的時間。

更一般的術語將是回調函數;像C#這樣的語言有特殊的回調對象,稱爲代表,因爲他們不把功能當作(良好的)頭等公民用他們的語言來對待。 在功能語言如OCaml中,函數與其他值沒有區別,所以您可以像傳遞整數值一樣傳遞它們,而不需要指針等。這使得用這些語言編寫回調函數非常自然,以至於他們的程序員甚至不需要一個奇特的名字。 ;)

事實上,OCaml的標準庫有許多高階函數,它將其他函數作爲參數。下面是一個例子:

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

List.iter函數採用print_endline功能「回調」參數,並將它施加到第二參數(字符串列表)中的每個元素。由於OCaml允許函數具有副作用,因此您甚至可以提供一個函數List.iter修改程序中其他地方的某些引用。