我正在实现类的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
答案 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? :new
是true
:< / p>
1.class.respond_to? :new #=> false
:a.class.respond_to? :new #=> false
'cat'.class.respond_to? :new #=> true
我邀请读者“证明”这些猜想,或反驳他们(例如,反例)。