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

ruby – 何时使用undef_method,何时使用remove_method?

发布时间:2020-12-16 20:19:16 所属栏目:百科 来源:网络整理
导读:我想重新定义一个方法,但是避免与之相关联的警告.我应该使用undef_method还是remove_method这样做? (是的,重新定义方法有点恶作剧,我这样做是因为在运行单元测试时我想要使用一些记忆,而不是运行程序时). 解决方法 从 fine manual: undef_method(symbol)
我想重新定义一个方法,但是避免与之相关联的警告.我应该使用undef_method还是remove_method这样做?

(是的,重新定义方法有点恶作剧,我这样做是因为在运行单元测试时我想要使用一些记忆,而不是运行程序时).

解决方法

从 fine manual:

undef_method(symbol) → self

Prevents the current class from responding to calls to the named method. Contrast this with remove_method,which deletes the method from the particular class; Ruby will still search superclasses and mixed-in modules for a possible receiver.

所以这样一个remove_method:

class CC < C
    remove_method :m
end

基本上与此相反:

class CC < C
    def m
    end
end

其中,def将方法m添加到类中,remove_method:m删除m.但是,如果超类有一个m方法,那么仍然会被使用.

undef_method,OTOH,更像是这样:

class CC < C
    def m
        raise 'No,you cannot do that.'
    end
end

所以undef_method实际上并没有删除该方法,它会使用一个特殊的内部标志替换该方法,如果您尝试调用该方法,则会引起Ruby的抱怨.

听起来你正在尝试替换一个现有的方法,而替换在语义上与删除相同,后跟一个add,因此remove_method可能更合适.然而,如果你想要偏执,并确保替换方法到位,那么undef_method将是有用的;或者,如果由于某种原因,您需要在一个地方删除该方法并将其添加到另一个位置,则undef_method至少会告诉您,您只做了一半的工作,而remove_method会让您离开超级类的实现(和可能的奇怪的错误)或者一个比较混乱的NoMethodError.

(编辑:李大同)

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

    推荐文章
      热点阅读