大佬教程收集整理的这篇文章主要介绍了如何在调用类的任何其他方法时调用类的方法(Ruby),大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
class Car def repair puts "Repaired!" end def drive # content end def checkup # content end end
在这个例子中,如果我在Car的实例上调用任何方法,我应该总是调用修复方法.我如何在Ruby中执行此操作?
注意:我也希望在内置方法中调用修复,例如Carinstance.class也应该调用修复.
我采取的方法是使用BasicObject#method_missing:
class Car def repair puts "Repaired!" end def drive puts "Drive!" end def checkup puts "checkup!" end def method_missing(m,*args) if @@ims.key?(m) ret = send(@@ims[m],*args) repair ret else super end end
@@ims = instance_methods(false).each_with_object({}) do |m,h| next if (m == :repair || m == :method_missing) saved_name = "_#{m}" alias_method saved_name,m h[m] = saved_name remove_method(m) end end car = Car.new car.repair Repaired! car.drive Drive! Repaired! car.checkup # checkup! Repaired! car.wash # => in `method_missing': undefined method `wash'...
解析类Car后,在构造完所有实例方法之后,执行以下操作,我用一个例子解释:
instance_methods(false) # => [:repair,:drive,:checkup,:method_missing]
each_with_object({})创建一个哈希(最初为空),由块变量h引用(稍后将详细介绍).
next if (m == :repair || m == :method_missing)
原因:修复和:method_missing被跳过.
当m => :drive,以下三个语句有效重命名:驱动到:_drive并添加:drive“=>”_drive“到hash h.
each_with_object返回
@@ims = {:drive=>"_drive",:checkup=>"_checkup"}
现在
instance_methods(false) # => [:repair,:method_missing,:_drive,:_checkup]
因为不再有方法:drive,Car.new.drive调用method_missing(:drivE).后者发现@@ ims有一个键:drive,所以它使用send来调用:_drive,调用:repair并返回:_drive的返回值.如果method_missing传递的方法不是@@ ims的键,则调用super并引发异常.
在一个现在删除的编辑中,我建议包含内置实例方法,只需将instance_methods(false)更改为instance_methods,但警告可能出现意外的副作用. @Kal指出无法删除内置实例方法,因此该方法不起作用.这也是一样 – 不应该以这种方式搞乱Ruby.我显然没有测试我的断言.耻辱!
以上是大佬教程为你收集整理的如何在调用类的任何其他方法时调用类的方法(Ruby)全部内容,希望文章能够帮你解决如何在调用类的任何其他方法时调用类的方法(Ruby)所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。