【发布时间】:2016-04-07 01:05:55
【问题描述】:
我试过了:
1.respond_to? "clone" # => true
1.clone # => TypeError: can't clone Fixnum
似乎一个对象可以报告它接受了一条消息,但直接引发了一个异常。
我正在尝试写一个deep_copy。是否有内置的或者某些代码 sn-ps 已经可以做到这一点?如果我需要决定某个东西是否可以克隆,我是否需要以任何方式调用它,然后从异常中rescue 知道它不是?
如果一个对象会引发异常,那么(1)报告false是否有意义,或者是由于Object提出的接口要求,以及(2)我可以告诉任何对象向respond_to "foo"报告虚假?
【问题讨论】:
-
A Fixnum 响应
clone,因此1.respond_to?(:clone)返回true是有意义的。考虑一下:如果您编写了一个带有方法def foo; raise "Error!" end的类,您是否希望该类的实例为respond_to(:foo)返回true?我会。它是否引发错误并不重要。如果它引发了一个没有意义的 NoMethodError,但这里不是这种情况。 -
换句话说,奇怪的不是
respond_to?的行为,而是Kernel#clone的定义只是为了返回一个错误。 -
如果您添加以下问题可能会很有趣:“为什么定义
clone只是为了返回错误?它在什么用例中有帮助?” -
@sawa return ≠ raise
-
Fixnum 的任何方法都不会改变对象 - 可能不需要支持
clone,因为它永远不需要。