class X
def method_missing( methodname, *args )
puts( "Class #{self.class} does not understand: #{methodname}( #{args.inspect} )" )
end
end
class Y < X
def aaa
puts( "aaa method" )
end
remove_method( :aaa )
end
class Z < Y
def method_missing( methodname, *args )
super
puts( "Now creating method #{methodname}( )" )
self.class.send( :define_method, methodname, lambda{ |*args| puts( args.inspect) } )
end
end
ob = X.new
ob.aaa( 1,2,3 )
ob2 = Y.new
ob2.ccc( "hello world" )
ob3 = Z.new
ob3.ddd( 1,2,3)
ob3.ddd( 4,5,6 )
=begin
output:
Class X does not understand: aaa( [1, 2, 3] )
Class Y does not understand: ccc( ["hello world"] )
Class Z does not understand: ddd( [1, 2, 3] )
Now creating method ddd( )
[4, 5, 6]
=end
Ruby的method_missing可以定义client调用不存在的方法时的行为
最新推荐文章于 2021-11-11 17:18:31 发布