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

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...