''pasar parámetro por referencia'' en Ruby?
parameter-passing pass-by-reference (5)
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
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
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''
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 programadores de Java llamarían a los objetos Fixnum
inmutables .
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 .