Ruby #clone在Object中定义.令我惊讶的是,有些课程在调用时会引发异常.我发现NilClass,TrueClass,FalseClass,Fixnum都有这种行为.
1)是否存在完整的类列表(至少是核心类),哪些不允许#clone?或者有没有办法检测特定类是否支持#clone?
2)有什么问题42.clone?
我不认为有正式的清单,至少除非你算上读源.原因2)不起作用是因为应用于Fixnums的优化.它们作为实际值在内部存储/传递(因此是true,false和nil),而不是作为指针.天真的解决方案是42.clone返回相同42,但随后不变量obj.clone.object_id != obj.object_id将不再保持,42.clone实际上不会克隆.
Fixnum是一个特殊的课程,由语言进行特殊处理.从程序启动的时间开始,对于类可以表示的每个数字,只有一个Fixnum,并且它们被赋予了一个不占用任何额外空间的特殊表示 - 这样,基本的数学运算就不会分配和解除分配记忆犹如疯狂.因此,不能超过42个.
对于其他人来说,他们都有一个共同点:他们是单身人士.根据定义,只有一个单例类的实例,因此尝试克隆它是一个错误.