加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何在调用类的任何其他方法时调用类的方法(Ruby)

发布时间:2020-12-16 23:13:33 所属栏目:百科 来源:网络整理
导读:在 Ruby中,有没有办法在调用类的任何其他方法时调用方法? 例如, class Car def repair puts "Repaired!" end def drive # content end def checkup # content endend 在这个例子中,如果我在Car的实例上调用任何方法,我应该总是调用修复方法.我如何在Ruby中
在 Ruby中,有没有办法在调用类的任何其他方法时调用方法?
例如,
class Car
    def repair
        puts "Repaired!"
    end
    def drive
        # content
    end
    def checkup
        # content
    end
end

在这个例子中,如果我在Car的实例上调用任何方法,我应该总是调用修复方法.我如何在Ruby中执行此操作?

注意:我也希望在内置方法中调用修复,例如Carinstance.class也应该调用修复.

解决方法

我假设你想要在每个Car的其他实例方法返回后调用Car#repairto.我看到你已经添加了一个要求,其他方法也会调用修复.我在最后添加了一些关于将其扩展为包含内置实例方法的评论.

我采取的方法是使用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.我显然没有测试我的断言.耻辱!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读