我如何知道对象是否可以复制?

时间:2014-11-30 07:19:01

标签: ruby

我正在实现类的to_a方法,我希望复制可以的所有对象(如String),同时保留其他类型(仅限SymbolInteger)。首先我认为这很简单:

if object.respond_to? :dup
  object.dup
else
  object
end

结果是,所有对象都响应:dup,但整数和符号会引发类型错误。我能做到这一点:

begin
  object.dup
rescue TypeError
  object
end

但我想避免使用控制流的异常。


有没有办法检查一个对象是否可以复制而不依赖于异常?

我正在使用Ruby 2.0.0

2 个答案:

答案 0 :(得分:1)

无法给你一个好的回复,但这是我尝试要求ruby核心团队添加功能的示例(除非其他人找到一种简单的方法来确定对象是否可以复制或不是)。

考虑到BasicObject的所有对象都是从Object类继承的,所以这不应该是一个很大的补充。

所以也许这是.duplicable的情况?可以直接添加到核心。

bugs.ruby-lang.org/projects/ruby-trunk

答案 1 :(得分:1)

如果你还没有冻结obj那么(在Ruby 2中)我相信obj.frozen?true当且仅当obj不可复制时,我相信当且仅当true是不可变的时,才obj; e.g:

1.frozen?     #=> true
:a.frozen?    #=> true
'cat'.frozen? #=> false

检查obj是否可复制的另一种方法是(即使已冻结obj),我认为是obj.class.respond_to? :newtrue:< / p>

1.class.respond_to? :new     #=> false
:a.class.respond_to? :new    #=> false
'cat'.class.respond_to? :new #=> true

我邀请读者“证明”这些猜想,或反驳他们(例如,反例)。