我会试着回答你的第二个问题。那么,为什么 Ruby 使用其他Logger
类而不是您尝试定义的类呢?
Ruby 的基本特性之一是类的重新开放。假设您的应用程序中已经定义并加载了一些类:
class A
def foo
puts 'foo'
end
end
A.new.foo
#=> foo
如果在那之后 Ruby 解释器遇到类似的情况:
class A
def bar
puts 'bar'
end
end
它没有重新定义 class A
,而只是将此定义附加到前一个定义中。在结果中已经定义的类A
得到了新的实例方法bar
:
A.new.foo # still works
#=> foo
A.new.bar # new method
#=> bar
由于 Ruby 处理方法调用的方式,在类的第二次定义(实际上是重新打开)之前A
初始化的类的所有实例也会获得这个新方法。因此,每次重新打开一个类时,都会向该类本身以及该类的所有先前初始化的实例添加新功能。A
bar
重新打开类还允许重写现有类的方法:
class A
def foo
puts 'new foo'
end
end
A.new.foo
#=> new_foo
考虑到这一特性以及 Rails 已经Logger
为您加载了标准类这一事实,您的定义只会重新打开该类,但甚至不会更改任何内容。