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)
War es hilfreich?

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"}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top