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
有两种方法: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"]
Run Code Online (Sandbox Code Playgroud)
在Ruby中,您始终可以向现有类添加方法,即使它是核心方法:
class String
def bar
"bar"
end
end
"foo".bar # => "bar"
Run Code Online (Sandbox Code Playgroud)
此功能称为" 开放类".这是一个很棒的功能,但你应该小心:不小心使用它,你会像猴子一样打补丁.
归档时间: |
|
查看次数: |
3811 次 |
最近记录: |