Die meisten Objekte in Ruby werden als Referenz übergeben und können dupliziert werden. ZB:
s = "Hello"
t = s # s & t reference to the same string
t.upcase! # modifying either one will affect the other
s # ==> "HELLO"
Einige Objekte in Ruby sind jedoch sofort. Sie werden nach Wert übergeben, es kann nur einen Wert geben, der nicht getäuscht werden kann. Dies sind beliebige (kleine) Ganzzahlen, true
, false
, Symbole und nil
. Viele Floats sind auch direkt in Ruby 2.0 auf 64-Bit-Systemen.
In diesem (absurden) Beispiel enthält jedes "42" dieselbe Instanzvariable.
class Fixnum
attr_accessor :name
alias_method :original_to_s, :to_s
def to_s
name || original_to_s
end
end
42.name = "The Answer"
puts *41..43 # => 41, The Answer, 43
Da Sie normalerweise erwarten würden something.dup.name = "new name"
kein anderes Objekt beeinflussen als die Kopie mit dup
erhalten, wählt Rubin nicht dup
auf immediates zu definieren.
Ihre Frage ist komplexer als es scheint. Es gab some discussion auf Rubin-Kern, wie dies erleichtert werden kann. Auch andere Arten von numerischen Objekten (Floats, Bignums, Rationales und komplexe Zahlen) können nicht getäuscht werden, obwohl sie auch nicht unmittelbar sind.
Beachten Sie, dass Active (Teil der Schienen) duplicable?
für alle Objekte die Methode bietet
ActiveSupport, nicht Rails, bietet die 'duplizierbare?' Methode.Sie könnten also ActiveSupport installieren und benötigen ('require 'active_support'), wenn Sie diese (und viele andere) Hilfsmethoden möchten. – henrikhodne
In der Tat. Aktualisiert. –
Der Link sollte durch https://bugs.ruby-lang.org/issues/1844 ersetzt werden. Außerdem wurde das Feature abgelehnt, da offensichtlich keine Fortschritte erzielt wurden. –