你可以重新定义ruby课程吗? 或者这只是在irb

我点燃了irb,然后键入:

class Point end

然后我再次键入,但添加了一些其他的东西。

Irb没有抱怨我正在定义一个已经存在的类。

在Ruby中,您始终可以向现有类添加方法,即使它是核心方法:

class String def bar "bar" end end "foo".bar # => "bar" 

此function称为“ 开放类” 。 这是一个很棒的function,但你应该小心:不小心使用它,你会像猴子一样打补丁 。

实际上你没有重新定义Point类,你重新打开它。 一个小代码片段来说明差异:

 class Point def foo end end class Point def bar end end 

Now Point有两种方法: foobar 。 所以Point的第二个定义并没有取代之前的定义,而是添加了它。 这在ruby脚本和irb中都是可能的(也可以使用标准库中的类,而不仅仅是您自己的类)。

也可以通过使用remove_const首先删除类名的先前绑定来真正重新定义类:

 class Point def foo end end Object.send(:remove_const, :Point) class Point def bar end end Point.instance_methods(false) #=> ["bar"]