Ich weiß noch nicht, wie für Klonierbarkeit richtig zu testen, aber hier ist ein sehr klobig, bösen Weg für clonablity zu testen Trapping mit Fehler:
def clonable?(value)
begin
clone = value.clone
true
rescue
false
end
end
Und hier ist, wie Sie selbst die nicht klonbare klonen. Zumindest für die wenigen Klassen, mit denen ich es vermasselt habe.
def super_mega_clone(value)
eval(value.inspect)
end
Hier einige Beispiel-Tests:
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
Ich möchte wirklich wissen, wie Sie testen, ob eine Klasse klonbar ist mir. Es scheint so, als ob eine Klasse sich nicht klonen lassen möchte, dann sollte sie die Klon-Methode privat machen, die sie von Object erbt, so dass Sie nur unter public_methods auf ihre Existenz testen können. Es scheint mir der gesunde Menschenverstand. –