2011-03-22 75 views
7

如何重新定义ruby中的类方法?Ruby - 如何重新定义类方法?

举例说,我想重新定义方法File.basename("C:\abc.txt")我该怎么做?

这不起作用:

class File 
    alias_method :old_bn, :basename 

    def basename(*args) 
    puts "herro wolrd!" 
    old_bn(*args) 
    end 
end 

我得到: undefined method 'basename' for class 'File' (NameError)

顺便说一句,我使用JRuby

回答

15

alias_method是为实例方法。但是File.basename是一种类方法。

class File 
    class << self 
    alias_method :basename_without_hello, :basename 

    def basename(*args) 
     puts "hello world!" 
     basename_without_hello(*args) 
    end 
    end 
end 

class << self评估关于“一流水平”(Eigenklass)的一切 - 这样你就不需要写self.def self.basename)和alias_method适用于类的方法。

+2

只是'class << Foo'有什么问题? – 2011-03-22 11:03:34

+4

个人喜好。如果我使用monkey-patch,我倾向于在我的'core_ext'中搜索'class File',并希望找到所有修改。同样,如果新手开始编写代码并且还没有看到这个习语,那么google'class << self'会更容易。 – 2011-03-22 12:33:49

1
class << File 
    alias_method :old_bn, :basename 
    def basename(f) 
    puts "herro wolrd!" 
    old_bn(*args) 
    end 
end