tôi vẫn không biết làm thế nào để kiểm tra clonability đúng nhưng đây là một cách ác rất vụng về để kiểm tra clonablity sử dụng bẫy lỗi:
def clonable?(value)
begin
clone = value.clone
true
rescue
false
end
end
Và đây là cách bạn có thể sao chép ngay cả những unclonable. Ít nhất là cho rất ít lớp học tôi đã mệt mỏi với nó.
def super_mega_clone(value)
eval(value.inspect)
end
Dưới đây là một số thử nghiệm mẫu:
b = :b
puts "clonable? #{clonable? b}"
b = proc { b == "b" }
puts "clonable? #{clonable? b}"
b = [:a, :b, :c]
c = super_mega_clone(b)
puts "c: #{c.object_id}"
puts "b: #{b.object_id}"
puts "b == c => #{b == c}"
b.each_with_index do |value, index|
puts "[#{index}] b: #{b[index].object_id} c: #{c[index].object_id}"
end
b[0] = :z
puts "b == c => #{b == c}"
b.each_with_index do |value, index|
puts "[#{index}] b: #{b[index].object_id} c: #{c[index].object_id}"
end
b = :a
c = super_mega_clone(b)
puts "b: #{b.object_id} c: #{c.object_id}"
> clonable? false
> clonable? true
> c: 2153757040
> b: 2153757480
> b == c => true
> [0] b: 255528 c: 255528
> [1] b: 255688 c: 255688
> [2] b: 374568 c: 374568
> b == c => false
> [0] b: 1023528 c: 255528
> [1] b: 255688 c: 255688
> [2] b: 374568 c: 374568
> b: 255528 c: 255528
Nguồn
2010-12-11 02:15:44
Tôi thực sự muốn biết làm thế nào bạn kiểm tra xem một lớp có nhân bản được không. Có vẻ như nếu một lớp không muốn cho phép bản thân được nhân bản thì nó sẽ làm cho riêng phương thức sao chép mà nó kế thừa từ Object để bạn có thể kiểm tra sự tồn tại của nó chỉ dưới public_methods. Có vẻ như thông thường với tôi. –