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

Ruby 如何知道对象是否可以复制?,ruby,Ruby,我正在实现类的to_a方法,我希望所有可以复制的对象(如String)都被复制,而其他类型的对象(如Symbol和Integer)都被复制。首先我认为这很简单: if object.respond_to? :dup object.dup else object end 事实证明,所有对象都响应:dup,但整数和符号会引发类型错误。我可以这样做: begin object.dup rescue TypeError object end 但我希望避免对控制流使用异常 有没有办法

我正在实现类的
to_a
方法,我希望所有可以复制的对象(如
String
)都被复制,而其他类型的对象(如
Symbol
Integer
)都被复制。首先我认为这很简单:

if object.respond_to? :dup
  object.dup
else
  object
end
事实证明,所有对象都响应
:dup
,但整数和符号会引发类型错误。我可以这样做:

begin
  object.dup
rescue TypeError
  object
end
但我希望避免对控制流使用异常


有没有办法检查对象是否可以在不依赖异常的情况下复制


我使用的Ruby 2.0.0不能给您一个好的答复,但这是一个示例,我将尝试要求Ruby核心团队添加功能(除非其他人找到一种简单的方法来确定对象是否可以复制)

考虑到所有为BasicObject保存的对象都继承自类对象,这不应该是一个很大的增加

所以,也许这是一个可以复制的例子?可以直接添加到核心


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

如果你没有冻结
obj
那么(无论如何在ruby 2中)我相信
obj.freezed?
true
当且仅当
obj
是不可复制的,我相信
true
当且仅当
obj
是不可复制的;e、 g:

1.frozen?     #=> true
:a.frozen?    #=> true
'cat'.frozen? #=> false
检查
obj
是否可复制的另一种方法是(即使
obj
已冻结),我认为是查看
obj.class.respond_to?:新的
是正确的:

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

我请读者“证明”这些猜测,或反驳它们(例如,用反例)。

@Surya:将其添加到问题中,sorry@Surya:是,
#respond_to?
为所有对象返回
true
。这就是问题所在
#dup
在整数和符号上引发了一个类型错误。我相信您已经遇到了。那个人也有同样的想法。我想你可以创建一个助手,但无论如何还是会使用异常处理。我应该滚动一下。看起来像Rails(特别是),添加了一个方法。添加那个宝石可行吗?@PaulRichter似乎Rails硬编码了那个@Hubro您可以要求类/模块的用户实现2/3方法:
duplicable?
dup
/
clone
(已定义)。这应该是一个注释。