在Ruby中"按引用传递参数"?

时间:2020-03-06 15:01:01  来源:igfitidea点击:

在Ruby中,是否可以通过引用传递具有值类型语义的参数(例如Fixnum)?
我正在寻找类似于C#的'ref'关键字的东西。

例子:

def func(x) 
    x += 1
end

a = 5
func(a)  #this should be something like func(ref a)
puts a   #should read '6'

顺便提一句。我知道我可以使用:

a = func(a)

解决方案

Ruby根本不支持"按引用传递"。一切都是对象,对这些对象的引用始终按值传递。实际上,在示例中,我们正在按值传递对" Fixnum"对象的引用的副本。

代码的问题在于,x + = 1'不会修改传递的Fixnum`对象,而是会创建一个全新的独立对象。

我认为,Java程序员会将Fixnum对象称为不可变的。

我们可以通过显式传入当前绑定来完成此操作:

def func(x, bdg)
  eval "#{x} += 1", bdg
end

a = 5
func(:a, binding)
puts a # => 6

在Ruby中,我们不能通过引用传递参数。以示例为例,我们将必须返回新值并将其分配给变量a或者创建一个包含该值的新类,并传递该类的实例。例子:

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