你可以重新定义红宝石课吗?或者这只是在irb

Bla*_*man 8 ruby ruby-on-rails

我点燃了irb,然后键入:

class Point end

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

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

sep*_*p2k 19

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

class Point
  def foo
  end
end

class Point
  def bar
  end
end
Run Code Online (Sandbox Code Playgroud)

现在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"]
Run Code Online (Sandbox Code Playgroud)


Yas*_*man 7

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

class String
  def bar
    "bar"
  end
end

"foo".bar # => "bar"
Run Code Online (Sandbox Code Playgroud)

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