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
(已定义)。这应该是一个注释。