‘pasar parámetro por referencia’ en Ruby?

En Ruby, ¿es posible pasar por referencia un parámetro con semántica de tipo de valor (por ejemplo, un Fixnum)? Estoy buscando algo similar a la palabra clave ‘ ref ‘ de C #.

Ejemplo:

def func(x) x += 1 end a = 5 func(a) #this should be something like func(ref a) puts a #should read '6' 

Por cierto. Sé que podría usar:

 a = func(a) 

Puede lograr esto al pasar explícitamente el enlace actual:

 def func(x, bdg) eval "#{x} += 1", bdg end a = 5 func(:a, binding) puts a # => 6 

Ruby no admite “pasar por referencia” en absoluto. Todo es un objeto y las referencias a esos objetos siempre pasan por valor. En realidad, en su ejemplo está pasando una copia de la referencia al Objeto Fixnum por valor.

El problema con el código es que x += 1 no modifica el Objeto Fixnum pasado, sino que crea un objeto completamente nuevo e independiente.

Creo que los progtwigdores de Java llamarían a los objetos Fixnum inmutables .

En Ruby no puedes pasar parámetros por referencia. Para su ejemplo, debería devolver el nuevo valor y asignarlo a la variable a o crear una nueva clase que contenga el valor y pasar una instancia de esta clase. Ejemplo:

 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 

Puedes probar el siguiente truco:

 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

Los objetos Fixnum tienen un valor inmediato. Esto significa que cuando se asignan o pasan como parámetros, se pasa el objeto real, en lugar de una referencia a ese objeto.

También Ruby pasa por valor .