2016-03-01 44 views
0

我有一個方法f(x),其中對參數x的唯一要求是它實現了each方法,而在每個迭代中依次產生一個字符串。重新定義SomeClass#每個只有一個實例

我可以用f

myfile = File.open('....') 
f(myfile) 
myfile.close 

現在到了扭曲,產生一個文件的行:File#each返回包括換行符文件的每一行,但我想f使用chomped線的文件。我不想觸碰f的執行情況。

一種解決方案可能會(我不知道這個解決方案是否是聲音相對於的each使用)是繼承File

class ChompingFile < File 
    alias_method :file_each,:each 
    def each 
    file_each {|line| yield(line.chomp)} 
    end 
end 

myfile = ChompingFile.open('....') 
f(myfile) 
myfile.close 

但是,我可以做同樣的沒有子,但修改實例myfile?我第一次嘗試是

myfile = File.open(.....) 
myfile.alias_method(:file_each,:each) # DOES NOT WORK 
def myfile.each 
    file_each {|line| yield(line.chomp)} 
end 
f(myfile) 
myfile.close 

這給出了一個錯誤,那alias_method是不確定的。我想我只有在self被綁定到一個類而不是一個實例時纔可以使用它。

是否有可能實現我想要的? (而且,是明智這樣做呢?)

回答

2

你可以叫就叫super:(由約爾格W¯¯米塔格爲suggested

def myfile.each 
    super { |line| yield(line.chomp) } 
end 

例子:

require 'stringio' 
myfile = StringIO.new("foo\nbar\nbaz\n") 

myfile.each { |line| p line } 
#=> "foo\n" 
# "bar\n" 
# "baz\n" 

def myfile.each 
    super { |line| yield(line.chomp) } 
end 

myfile.rewind 
myfile.each { |line| p line } 
#=> "foo" 
# "bar" 
# "baz" 
3

這應該做

myfile = File.open(.....) 

class << myfile 
    alias_method :file_each, :each 

    def each 
     file_each {|line| yield(line.chomp)} 
    end 
end 
+3

爲什麼'alias_method'跳舞?爲什麼不叫「超級」? –

相關問題