【问题标题】:Ruby - remove inherited methodsRuby - 删除继承的方法
【发布时间】:2011-10-24 05:25:36
【问题描述】:

是否可以删除 Ruby 中的某些继承方法?我的意思是,我可以覆盖它,但是还有其他方法吗?

Class ABC
end

a = ABC.new

puts a.id

这里,id 方法继承自 Object 以及其他方法,如tapclasstype 等。我想删除这些方法。

编辑:我使用的是 Ruby 1.8.7

【问题讨论】:

  • 为什么要删除它们?
  • 参考我对 Chowlett 回答的评论;)

标签: ruby


【解决方案1】:

正如 tadman 所说,您可以创建一个 BlankSlate 对象,或者在 ruby​​ 1.9 中,BasicObject 类具有最少的方法。一个快速的谷歌搜索出现了这个以供进一步阅读:http://www.humbug.in/docs/ruby-best-practices/I_sect13_d1e2654.html

Rails 似乎已经内置了 BlankSlate:http://rubydoc.info/docs/rails/2.3.8/BlankSlate

【讨论】:

  • 对不起,我忘了说我使用的是 Ruby 1.8.7
【解决方案2】:

是的 - undef_method :foo 将阻止对方法 foo 的任何调用(与 remove_method :foo 形成对比,后者从子进程中删除该方法,但仍沿继承链向上传递)。

不过,为什么你要删除像 id 这样的东西?

【讨论】:

  • 我正在使用一个类(一种 DSL),它充当 xml 的映射(一种定义明确的格式,没有深度嵌套),并使用缺少方法来访问 xml 节点。例如,如果 xml 有一个名为“book”的节点,我将使用 a.book 访问节点内容。如果 xml 节点具有名称(我无法控制),例如“id”、“type”等,则不会触发此 method_missing。删除这些方法有什么问题吗?我将该类仅用于此映射,而不用于其他任何东西。有没有我不应该删除的方法?
  • 啊,好的。这是有道理的,感觉是一个很好的解决方案(尽管我可能会使用 XML 解析库......)。我想,只要你离开__foo__ 方法,你应该没问题。
  • 不客气!请记住,您也可以通过单击投票按钮下的复选标记“接受”此答案为“正确”。
  • 请注意,如果您取消定义方法名称,则永远无法重新添加具有该名称的方法。即使它存在,该类也不会再响应它。
【解决方案3】:

您始终可以创建一个空白板类来派生:

class BlankSlate
  instance_methods.each do |m|
    undef_method(m) unless (m.match(/^__/))
  end
end

这应该去掉所有方法,除了你不应该乱用的内部方法,比如__send__

【讨论】:

    猜你喜欢
    • 2015-12-27
    • 1970-01-01
    • 2020-07-13
    • 2011-02-16
    • 2023-03-20
    • 1970-01-01
    • 2012-05-28
    • 2015-10-26
    • 2011-10-05
    相关资源
    最近更新 更多