2
一旦我有一個File
實例,我想檢查是否它的文件格式和extend
該實例與相應的方法一致:紅寶石:文件格式通過模塊擴展文件處理
module MP3
def self.extended(base)
raise "Can only extend a File" unless base.is_a?(File)
raise "Incorrect file format" unless is_mp3?(base)
end
def self.is_mp3?(file)
# Full metadata check if it is a MP3 format
end
def year
# Extract year from metadata
end
end
song = File.new("song.mp3")
if MP3.is_mp3?(song)
song.extend(MP3)
puts song.ctime # Original File method
puts song.year # Extended MP3 method
end
picture = File.new("picture.jpg")
MP3.is_mp3?(picture) #=> False
picture.extend(MP3) #=> raise "Incorrect file format"
我猜是不是傳統的,但我的需求是:
- 能夠處理多種文件格式。
- 在知道其格式之前打開文件。
- 重新使用相同的
File
實例,而不必創建新對象。 (見下文) - 在同一個對象中同時使用原始的
File
方法和格式特定的方法。 - 添加相應方法前檢查文件格式是否正確。
該方法是否正確?
這個問題是後續的previous question。
我想延長的,而不是因爲我使用File
的包裝,保存在RAM中的整個文件中創建一個新的實例現有File
實例(從磁帶驅動器不允許順序訪問讀取)。
正如我所說,在我的情況下,文件是打開之前,我不想創建一個新的實例。這就是爲什麼我正在考慮擴展實例,而不是課堂。基本上,這是因爲我需要傳遞比'filename'更多的東西,使用大量內存。所以這種直接從'filename'創建實例的方法對我不起作用。 – Victor
@Victor關鍵是將所有的邏輯放到工廠類中。我重新激活了工廠來證明這一點。 – Schwern
@Victor讓工廠方法的班級爲您開放。你是什麼意思「更多的記憶」?任意擴展對象比使用特定子類的庫存類實例在性能方面更受懲罰。 – tadman