ruby – 如何检查一个变量是否真的response_to:dup?

前端之家收集整理的这篇文章主要介绍了ruby – 如何检查一个变量是否真的response_to:dup?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想使用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

猜你在找的Ruby相关文章