私はあなたの2番目の質問に答えようとします。では、なぜRubyはLogger
、自分で定義しようとしたクラスではなく、他のクラスを使用しているのでしょうか。
Rubyの基本的な機能の1つは、クラスを再度開くことです。すでに定義され、アプリにロードされているクラスがあるとします。
class A
def foo
puts 'foo'
end
end
A.new.foo
#=> foo
その後、Rubyインタープリターが次のようなものに遭遇した場合:
class A
def bar
puts 'bar'
end
end
クラスA
を再定義するのではなく、この定義を前の定義に追加するだけです。結果として、すでに定義されているクラスA
は新しいインスタンスメソッドを取得しますbar
。
A.new.foo # still works
#=> foo
A.new.bar # new method
#=> bar
Rubyがメソッド呼び出しを処理する方法のため、クラスの2番目の定義(実際には再オープン)の前A
に初期化されたクラスのすべてのインスタンスも、この新しいメソッドを取得します。したがって、クラスを再度開くたびに、クラス自体と、このクラスの以前に初期化されたすべてのインスタンスに新しい機能を追加します。A
bar
クラスを再度開くと、既存のクラスのメソッドを書き換えることもできます。
class A
def foo
puts 'new foo'
end
end
A.new.foo
#=> new_foo
その機能を念頭に置いて、Railsがすでに標準Logger
クラスをロードしているという事実を考慮して、定義はクラスを再度開くだけで、何も変更しません。