2012-09-27 51 views
1

在典型的長時間運行的流程環境(比如rails server)中,Ruby應用程序看起來像是一個常見問題,爲了緩解開發難題,類重新加載是一個難以解決的重要問題。爲什麼Ruby不包含內置的類重新加載?

它讓我覺得,語言最清楚stdlib定義了哪些常量,並且完全瞭解哪些常量是從什麼文件加載的,何時加載的,當然還有提供重載它們的功能。

有來複雜的情況下,通過require 'foo',你也定義Bar,但這並不是太具有挑戰性的跟蹤,此外define_const已被使用的情況下也泥濘了事情。螺紋加載是另一個問題,但我真的可以看到允許線程從磁盤文件的當前狀態重新加載自己的情況。 (更快的測試服務器將#1想法)

現在看來似乎應該是一個語言特性,並沒有那麼多,許多不同的人需要推出解決方案的東西。

因此,在總結,爲什麼,這是不是一種語言功能?看起來應該是這樣,儘管使用情況配置文件幾乎僅限於長時間運行的開發服務器。

這裏的另一個問題可能是「爲什麼Rails沒有使用內置的DRB模型來快速開發開發服務器,並跳過所有的類重新加載」,這也是一個有趣的討論,但現在還沒有。

回答

0

爲了能夠自動重新加載你需要知道一個類,類如何來構建。鑑於Ruby是如何動態的,在最微不足道的情況下這只是一件容易的事情。在最終形成最終形式之前,已經有一個階級被擴展和顯着改變是很常見的。確定重新創建課程所涉及的步驟並不容易,而跟蹤這些步驟可能會造成嚴重的性能下降。

很多將此歸結爲一個事實,即一類是方法,實例變量,類變量,常量和其他模塊和類的集合。與更多靜態類型的語言(如C++)不同,這些語言可以隨時在任何地方以任何理由聲明。班級的狀態不是可以簡單地重新生成的。

導軌前進約重裝類的方法是執行許多花樣,以確保所討論的類可被設置和重新加載。 Rails還必須提供幾個鉤子來通知擴展,一個類正在被重新加載,這樣一旦它被重建,它們就可以重新執行它的操作,否則許多擴展只會加載一次。

簡而言之,表面上似乎微不足道證明是非常棘手的確實。

+0

它似乎很棘手,但仍然是語言,而不是多個框架作者應該解決..謝謝你的答案。 –

+0

如果你不知好奇,你可能想看看ActiveSupport中的一些[magic](http://rkh.im/code-reloading)。 – tadman

+0

不錯的環節,我記得以前看過那篇文章,但是沒有足夠的技巧從當時那裏拿走很多東西。乾杯。 –

相關問題