2012-02-13 60 views
3

文件/ IO類類,我想在Ruby中實現一個類文件類(1.9),但不希望重新實施或裝飾的每一個方法StringIO和IO類提供。有沒有一個模塊可以幫助我?我想提供一個read()方法並獲得免費的readLines()方法(然後使用read())。尋找方法來輕鬆實現在Ruby中

這將是類似可比模塊如何增加運營商<<===>=>只要<=>已經實施。我尋找類似於文件的東西。

如果我沒有記錯,Java和/或Apache共享的工作是這樣的:有基本上只有一個或兩個方法,和所有其他人使用它們的讀/寫。

我執行寫文件和StringIO的對象包裝,透明地更新一個SHA256在每次寫入消化。

回答

2

如果你不想從IO繼承,那麼你可能會想使用的內核,特別opengets的方法和其readlinereadlines實現。

你扔掉了很多已經調試雖然預先編寫的代碼。就個人而言,我將IO子類別化,並將「讀取」和「寫入」類型例程別名爲某個安全名稱,然後創建新版本,通過調用原件來完成寫入操作,然後更新SHA256。

+0

從IO和StringIO的繼承是爲我好,只要我知道,我必須覆蓋,使結果非可查找和每write'接收經過'SHA256#update'方法字符串'哪些方法。我只是不想自己裝飾每一種方法。 – 2012-02-13 21:16:27

+0

使用Kernel方法不是一種選擇,因爲它們將根據參數(缺少)使用全局變量。 – 2012-02-13 21:55:44

2

正如你已經說,要實現「包裝類」,我會建議使用Decorator Pattern

Ruby允許你使用幾種方法來實現它,它很簡單,並且允許你正是你想要的:例如,如果使用method_missing來實現這個模式,你將只實現摘要計算所需的寫入方法。在實現中,將寫入委派給裝飾對象,並且還使用寫入的字符串更新SHA256摘要實例。

+0

我知道這種模式,我想避免裝飾〜10種方法。另外,很明顯,我不能「在返回值上執行我的SHA256」,例如'IO#write'方法將愉快地返回「寫入的字節數」,而不是原始字符串。所以,現在爲你的答案的那部分,也許你可以改善它,或只是刪除不正確的部分。 – 2012-02-13 21:25:35

+0

這就是Ruby中裝飾模式的要點 - 您不必修飾所有方法,如果使用例如'method_missing'的實現。只需執行那些你需要更新摘要的地方。從IO中讀取時,我的意思是返回值,因爲你在開始時正在討論閱讀。我會糾正那部分。 – emboss 2012-02-13 21:35:47

+0

Undid -1。我還是不太高興,因爲就我所見,我可以裝飾'''','putc','puts','syswrite'和'write',其中一些參數不同期望。我不能假設它是一個字符串,我得到了'def method_missing m,* a; @sha << a [0]; @ dec.send m,* a; end'。或者我可以嗎? – 2012-02-13 21:49:49