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? :新的很好,但有点太骇人听闻,我认为它的表现不好 所以引用@Linuxios
解决方法
没有一个更好的方法. 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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |