我想使用value.respond_to?(:dup)? value.dup:值,以检查我是否可以复制一个对象,但它失败了TypeError on booleans,nil或这样的“primitives”一样.
我结束了:
begin value = value.dup rescue #ignore,use the original if no dup-able (e.g nil,true,etc) end
有没有更好的办法?
奖金:为什么回应:笨蛋?
不是深渊,只是为了问题.
编辑:思想:
> obj.class.methods.include? :新的很好,但有点太骇人听闻,我认为它的表现不好
元帅也看起来像一个过度的杀戮
>一线救援本来可以是最好的解决方案,但是目前这个时候(IIUC matz is on that!)还是不可能进行类型特定的一线救援,而且JörgWMittag提到它的错误.
>我个人觉得,在对象层面定义的dup是错误的.
所以引用@Linuxios
There isn’t really a better way
解决方法
没有一个更好的方法. dup在Object上定义,这意味着任何想要不响应的类都需要重载它来抛出异常. NilClass,TrueClass,FalseClass和Number都是Object的子类.这意味着他们必须重写方法来抛出错误.
有一种方法,如果你正在寻找一个深层次的副本,就是使用通常的Marshal.load(Marshal.dump(obj)),它将处理数字,布尔和nil只是罚款.
例如:
1.9.3-p392 :001 > obj = "hi" => "hi" 1.9.3-p392 :002 > Marshal.load(Marshal.dump(obj)).object_id != obj.object_id => true 1.9.3-p392 :003 > obj = 3 => 3 1.9.3-p392 :004 > Marshal.load(Marshal.dump(obj)).object_id != obj.object_id => false