Ruby中的’通过引用传递参数’?

在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) 

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

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

Ruby根本不支持“通过引用传递”。 一切都是对象,对这些对象的引用总是按值传递。 实际上,在您的示例中,您通过值将引用的副本传递给Fixnum对象。

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

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

在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 

您可以尝试以下技巧:

 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对象具有直接价值。 这意味着当它们作为参数分配或传递时,将传递实际对象,而不是对该对象的引用。

Ruby也是值得传递的 。