可以为类动态定义类方法,如下所示:

class Foo
end

bar = %q{def bar() "bar!" end}
Foo.instance_eval(bar)

但你如何做相反的事情:remove/undefine类方法?我怀疑Module的remove_methodundef_method方法可能可以用于此目的,但我在谷歌搜索数小时后看到的所有示例都是用于删除/取消定义instance个方法,而不是类方法.或者你也可以通过一个语法传递到instance_eval来实现这一点.

提前谢谢.

推荐答案

class Foo
  def self.bar
    puts "bar"
  end
end

Foo.bar    # => bar

class <<Foo
  undef_method :bar
end
# or
class Foo
  singleton_class.undef_method :bar
end

Foo.bar    # => undefined method `bar' for Foo:Class (NoMethodError)

当你定义像Foo这样的类方法时.bar Ruby说这是Foo的单身班.Ruby不能将其放在Foo中,因为这样它将是一个实例方法.Ruby创建Foo的singleton类,将singleton类的超类设置为Foo的超类,然后将Foo的超类设置为singleton类:

Foo -------------> Foo(singleton class) -------------> Object
        super      def bar             super

有几种方法可以访问singleton类:

  • class <<Foo,
  • Foo.singleton_class,
  • class Foo; class << self,通常用于定义类方法.

注意,我们使用了undef_method,我们可以使用remove_method.前者阻止对该方法的任何调用,而后者只删除当前方法,如果存在超级方法,则可以回退到超级方法.更多信息请参见Module#undef_method.

Ruby相关问答推荐

Ruby:程序终止后仅写入/保存/可见的文件数据

碰撞检测测试中对象的 Nil 类

你如何称呼 Ruby 中的 &: 运算符?

方法如何在 Ruby 中使用哈希参数?

创建一个哈希值作为数组和默认值作为空数组

查明 IP 是否在 IP 范围内

在单个 node 上使用 XPath 返回所有 node 中的元素

如何将 STDOUT 捕获到字符串?

无法对 ruby​​ 哈希使用点语法

在 Ruby 中定义 [方括号] 方法是如何工作的?

在现有 Jekyll 安装中切换主题

Ruby RVM apt-get 更新错误

发现 Ruby 对象成员?

在 Ruby 中获取本月的最后一天

带有添加和删除参考的 Rails 迁移

在 Ruby 脚本中解析命令行参数

Ruby 中的自然语言处理

如何在 Ruby 中对数组进行分块

为依赖于环境变量的代码编写规范的最佳方法是什么?

如何在 Mac OS Sierra 10.12 上安装 Nokogiri