ハッシュから派生したクラスがあります。IRB で使用すると、ハッシュの内容がコンソールにダンプされます。Object.inspect/.to_s
代わりに、フォームの (どちらか不明)と同じ方法で印刷したいと思い#<MyHash:0x201e4c0>
ます。どうすればこれを達成できますか?
編集混乱を招くため、二次的な質問を削除する必要がありました。上記の質問は、私が答える必要があるものです。これは私が削除したものです:
万が一、継承階層の上位クラスのメソッドを呼び出す方法はありますか?
ハッシュから派生したクラスがあります。IRB で使用すると、ハッシュの内容がコンソールにダンプされます。Object.inspect/.to_s
代わりに、フォームの (どちらか不明)と同じ方法で印刷したいと思い#<MyHash:0x201e4c0>
ます。どうすればこれを達成できますか?
編集混乱を招くため、二次的な質問を削除する必要がありました。上記の質問は、私が答える必要があるものです。これは私が削除したものです:
万が一、継承階層の上位クラスのメソッドを呼び出す方法はありますか?
他のユーザーと共有したい新しいクラスを作成するときの基本的な作業の 1 つは、#inspect
、#to_s
、#==
、#<=>
およびその他のいくつかの基本的なメソッドを定義することです。inspect
したがって、新しいクラスを作成するときは、自分で関数を作成する必要があります。
あなたの義務はこれで終わりです。しかし今、クラスで深い先祖のメソッドを利用する方法として一般的に述べることができるあなたの質問に対して、1つの方法は次のようになります:
class MyHash < Hash
def inspect
Object.instance_method( :inspect ).bind( self ).call
end
end
ここでは、MyHash
の子孫であることが要件ですObject
。そうでない場合、UnboundMethod インスタンスはそれにバインドされません。( についてObject
は、これは明らかに真実ですが、一般的にはそうではない可能性があります。)
コメント後に更新:
上記のコードにより、MyHash は Object インスタンス メソッドを呼び出すことができますinspect
。効果を強く知覚するにto_s
は、 Object#inspect によって呼び出される method を使用して手順を繰り返す必要があります。
class MyHash < Hash
def inspect
Object.instance_method( :inspect ).bind( self ).call
end
end
h = MyHash[ a: 1, b: 2 ]
#=> {:a=>1, :b=>2 }
# The above code did work, but Object#inspect happens to call to_s() instance method
# To see the change
class MyHash
def to_s
Object.instance_method( :to_s ).bind( self ).call
end
end
h.inspect
#=> "#<MyHash:0x90ee01c>"