0

ハッシュから派生したクラスがあります。IRB で使用すると、ハッシュの内容がコンソールにダンプされます。Object.inspect/.to_s代わりに、フォームの (どちらか不明)と同じ方法で印刷したいと思い#<MyHash:0x201e4c0>ます。どうすればこれを達成できますか?

編集混乱を招くため、二次的な質問を削除する必要がありました。上記の質問は、私が答える必要があるものです。これは私が削除したものです:

万が一、継承階層の上位クラスのメソッドを呼び出す方法はありますか?

4

1 に答える 1

3

他のユーザーと共有したい新しいクラスを作成するときの基本的な作業の 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>"
于 2012-11-20T11:46:46.030 に答える