你可以重新定义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
有两种方法: foo
和bar
。 所以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"]