0

我有一个从哈希派生的类。当我在 IRB 中使用它时,它会将散列的内容转储到控制台。相反,我希望它以与表单中的Object.inspect/.to_s(不确定哪个)相同的方式打印#<MyHash:0x201e4c0>。我如何实现这一目标?

编辑我不得不删除次要问题,因为它导致了混乱。上面的问题是我需要回答的。这是我删除的:

有没有办法调用继承层次结构中更高的类的方法?

4

1 回答 1

3

编写要与他人共享的新类时,其中一项基本工作是定义一些基本方法,其中包括#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>"
于 2012-11-20T11:46:46.030 回答