道歉爲這個問題的遞歸性質,但chosen answer對SO的問題讓我質疑我對反思的理解。猴子修補/班級重新開放真的是一個反思的例子嗎?
我認爲反思主要是關於在程序運行時查詢程序的內部事件。此響應中給出的示例修補了Ruby的內置Integer類。
- 這不是更像是函數重載/繼承而不是運行時修改嗎?
- 重新開課真的是反思的一個例子嗎?
道歉爲這個問題的遞歸性質,但chosen answer對SO的問題讓我質疑我對反思的理解。猴子修補/班級重新開放真的是一個反思的例子嗎?
我認爲反思主要是關於在程序運行時查詢程序的內部事件。此響應中給出的示例修補了Ruby的內置Integer類。
反射可以用來實現後期綁定。
延遲綁定可用於實現猴子修補。
猴子修補可用於實現該答案中顯示的編碼風格。
但還有其他一些方法可以實現不需要猴子修補或反射的功能。哎呀,一個好的宏預編譯器可以讓你關閉。
因此,技術上正確,但不是(恕我直言)最好的例子。
在增加遞歸級別的風險,我想回應,雖然你在這個鏈接引用我的答案。
由於我們對反射的直觀理解是指向內看,誤解很容易做出。這當然也是編程中反射的一個重要方面 - 例如,在Ruby中,我們有像instance_of這樣的方法來允許對象在運行時提問自己的問題。
但是看看:
反射是由一個 計算機程序可以觀察和 修改自身的結構和行爲 的過程。
正如您所看到的,反射不僅僅是運行時自我檢查。這也是改變運行時行爲的能力。重新開課也被稱爲「猴子補丁」。你可以閱讀更多關於它here。
猴子貼劑是一種方法, 而不改變 原始源代碼的 動態語言擴展或修改運行時代碼。
這個過程也被稱爲: - 游擊隊修補 - 擴展先前聲明的類 - 重新開啓班 - 動態芬克 - 劫持 - 鴨衝孔 - 法混寫
IYO,會是什麼是反思的更有效的例子嗎? – notnot 2009-02-13 20:19:42