2010-08-10 63 views
3

如何覆盖def方法?但这很奇怪,因为我不知道def方法的定义。它不是Module,不是Object,不是BasicObject(Ruby 1.9)。而def.class不要什么都不说;)Ruby - 覆盖def方法

我想用这样的:

sub_def hello 
    puts "Hello!" 
    super 
end 

def hello 
    puts "cruel world." 
end 

# ...and maybe it could print: 
# => "Hello!" 
# => "cruel world." 

非常感谢,您的任何想法。

回答

6

谁告诉过你def是一种方法?不是。这是一个关键字,如classif,end等。所以你不能覆盖它,除非你想写你自己的Ruby解释器。

+0

谢谢。我认为只使用一些DSL模块会更好;) – 2010-08-10 11:55:15

1

您可以使用alias_method。

alias_method :orig_hello, :hello 
def hello 
    puts "Hello!" 
    orig_hello 
end 
1

您可以使用块做一些类似的事情是这样的:

def hello 
    puts "Hello" 
    yield if block_given? 
end 

hello do 
puts "cruel world" 
end 
0

正如其他人所说,def不是方法,这是一个关键字。你不能“覆盖”它。你可以,但是,通过Ruby的元编程魔法定义了一个名为“高清”的方法:

define_method :def do 
    puts "this is a bad idea" 
end 

这仍然不会覆盖def关键字,但您可以用method(:def).call打电话给你的新方法。

所以,你(有点)有它。

注意:我不知道为什么你想要定义一个名为def的方法。不要这样做。