'Pass Parameter durch Verweis' in Ruby?
-
03-07-2019 - |
Frage
In Ruby, ist es möglich, durch Bezugnahme einen Parameter mit Wert-Typ-Semantiken passieren (beispielsweise ein Fixnum)? Ich suche nach etwas Ähnliches wie C # 's ' ref ' Schlüsselwort.
Beispiel:
def func(x)
x += 1
end
a = 5
func(a) #this should be something like func(ref a)
puts a #should read '6'
Btw. Ich weiß, ich könnte nur verwenden:
a = func(a)
Lösung
Sie können dies erreichen, indem explizit in der aktuellen Bindung übergeben:
def func(x, bdg)
eval "#{x} += 1", bdg
end
a = 5
func(:a, binding)
puts a # => 6
Andere Tipps
Rubin nicht unterstützt "pass by reference" überhaupt. Alles ist ein Objekt und die Verweise auf diese Objekte werden immer durch Wert übergeben. Eigentlich in Ihrem Beispiel sind vorbei Sie eine Kopie des Verweises auf das Fixnum
Objekt nach Wert.
Das Problem mit dem Code ist, bedeutet das x += 1
nicht das übergebene Fixnum
Objekt ändern, sondern schafft ein völlig neues und eigenständiges Objekt.
Ich denke, Java-Programmierer Fixnum
Objekte unveränderlich nennen.
In Ruby können Sie die Parameter nicht als Verweis übergeben. Für Ihr Beispiel würden Sie den neuen Wert und weisen Sie auf die Variable ein oder erstellen Sie eine neue Klasse, die den Wert enthält, und übergeben Sie eine Instanz dieser Klasse um zurückkehren müssen. Beispiel:
class Container
attr_accessor :value
def initialize value
@value = value
end
end
def func(x)
x.value += 1
end
a = Container.new(5)
func(a)
puts a.value
Sie können folgenden Trick versuchen:
def func(x)
x[0] += 1
end
a = [5]
func(a) #this should be something like func(ref a)
puts a[0] #should read '6'
http://ruby-doc.org/core-2.1.5 /Fixnum.html
Fixnum Objekte haben unmittelbaren Wert. Das bedeutet, dass, wenn sie zugeordnet sind oder geben als Parameter wird der Ist-Objekt übergeben, anstatt ein Verweis auf das Objekt.
Auch Ruby ist Pass von Wert .
Es scheint jedoch, dass zusammengesetzte Objekte, wie Hashes, als Referenz übergeben werden:
fp = {}
def changeit(par)
par[:abc] = 'cde'
end
changeit(fp)
p fp
gibt
{:abc=>"cde"}