加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 20:20:42 所属栏目:百科 来源:网络整理
导读:我想使用value.respond_to?(:dup)? value.dup:值,以检查我是否可以复制一个对象,但它失败了TypeError on booleans,nil或这样的“primitives”一样. 我结束了: begin value = value.duprescue #ignore,use the original if no dup-able (e.g nil,true,et
我想使用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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读