如何覆盖 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."
非常感谢,任何想法。
答案 0 :(得分:6)
谁告诉你def
是一种方法?不是。这是一个关键字,例如class
,if
,end
等。所以你不能覆盖它,除非你想编写自己的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
的方法。不要这样做。