io ancora non so come eseguire il test per clonabilità correttamente ma ecco un modo male molto goffo per verificare clonablity usando l'intercettazione degli errori:
def clonable?(value)
begin
clone = value.clone
true
rescue
false
end
end
Ed ecco come si può clonare anche il non clonabile. Almeno per le poche classi con cui mi sono stancato.
def super_mega_clone(value)
eval(value.inspect)
end
Ecco alcune prove a campione:
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
fonte
2010-12-11 02:15:44
voglio davvero sapere come si prova se una classe è clonabile me stesso. Sembra che se una classe non vuole permettere a se stessa di essere clonata, allora dovrebbe rendere privato il metodo clone che eredita da Object in modo che tu possa testare la sua esistenza solo sotto public_methods. Sembra il buon senso per me. –