2012-11-17 14 views
2

我試圖(爲了趣味和利益)添加了檢查ruby中的對象並發現其源代碼的功能。不是生成的字節碼,也不是內部表示的某些反編譯版本,而是被解析以創建該對象的實際源。使用Rubinius將「源」屬性添加到ruby對象

我對Rubinius瞭解得相當晚,雖然我還沒有完全掌握它,但我想我已經取得了一些進展。

雖然我無法弄清楚如何做到這一點。我的第一種方法是簡單地將另一個實例屬性添加到AST結構(例如,一個ClosedScope對象)。然後,在運行時解釋字節碼時,再次將該屬性拉出。

這似乎是一個很好的方法?

+0

您打算如何處理已擴展,曾多次課?我可以看到每種方法都附帶了源代碼的潛力,但在課堂層面上,如果不先爲方法解決問題,那麼看起來有問題。 – dgtized

回答

5

正如Samuel先生所說,您可以使用pry並執行show-source foo。但也許你想知道它是如何工作的。

Ruby提供了兩個有用的東西:首先,您可以獲取對象上所有方法的列表。請致電foo.methods。其次,它爲每個方法提供一個file_name和line_number屬性。

要查找對象的完整源代碼,我們將掃描所有的方法,並根據它們的定義將它們分組。然後我們將文件掃描回去,直到我們看到classmodule或rubyists用來定義方法的其他幾種方法。然後我們在每個文件中向前掃描,直到我們識別出整個類/模塊的定義。

正如dgitized指出的,如果人們有猴子補丁的核心對象,我們通常會得到多個這樣的定義。默認情況下,pry只顯示包含大多數方法的模塊定義;但您可以通過show-source -a請求其他人。

2

你看過撬嗎?這是一個Ruby解釋器/調試器,聲稱能夠完成你所要求的功能。

+0

我見過撬,我應該補充一點,我正在尋找一些不是基於控制檯的東西 - 我希望解釋者實際上支持檢查AST。 –

+0

我最終的目標是能夠將所有用戶定義的對象從內存序列化到文件系統中。我*可能*能夠撬撬做到這一點... –

+0

只需重用與您的要求匹配的Pry部分 - 或看看它的靈感:D – ioquatix

-1

你有沒有試過set_trace_func?這不是rubinius的具體內容,而是根據你的要求,而不是基於pry或其他寶石。

看到http://www.ruby-doc.org/core-1.9.3/Kernel.html#method-i-set_trace_func

+0

任何人都可以解釋爲什麼我被拒絕了嗎?我真的認爲set_trace_func解決了這個問題,並且它是內置的。 – Anko

+0

所有'set_trace_func'所做的就是在每次執行一行ruby時執行一個proc。關於如何使用它來恢復對象的源代碼,至少你的答案需要更多解釋,最糟糕的是 - 你的答案根本沒有幫助,因爲'set_trace_func'不是偶數相關。 – horseyguy