Ruby - 覆盖def方法

时间:2010-08-10 10:40:50

标签: ruby class object

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

我想使用类似的东西:

sub_def hello
  puts "Hello!"
  super
end

def hello
  puts "cruel world."
end

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

非常感谢,任何想法。

4 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:1)

您可以使用alias_method。

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

答案 2 :(得分:1)

您可以使用块来执行类似的操作:

def hello
  puts "Hello"
  yield if block_given?
end

hello do
 puts "cruel world"
end

答案 3 :(得分:0)

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

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

这仍然不会覆盖def关键字,但您可以使用method(:def).call调用新方法。

所以,你(有点)拥有它。

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