我有一个从哈希派生的类。当我在 IRB 中使用它时,它会将散列的内容转储到控制台。相反,我希望它以与表单中的Object.inspect/.to_s
(不确定哪个)相同的方式打印#<MyHash:0x201e4c0>
。我如何实现这一目标?
编辑我不得不删除次要问题,因为它导致了混乱。上面的问题是我需要回答的。这是我删除的:
有没有办法调用继承层次结构中更高的类的方法?
我有一个从哈希派生的类。当我在 IRB 中使用它时,它会将散列的内容转储到控制台。相反,我希望它以与表单中的Object.inspect/.to_s
(不确定哪个)相同的方式打印#<MyHash:0x201e4c0>
。我如何实现这一目标?
编辑我不得不删除次要问题,因为它导致了混乱。上面的问题是我需要回答的。这是我删除的:
有没有办法调用继承层次结构中更高的类的方法?
编写要与他人共享的新类时,其中一项基本工作是定义一些基本方法,其中包括#inspect
、#to_s
、#==
和#<=>
其他几个方法。所以你自己必须inspect
在创建一个新类时编写你的函数。
你的职责就这么多。但是现在,对于您的问题,通常可以说是如何在一个类中利用深层祖先的方法,一种方法是这样的:
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 调用:
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>"