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也是值得传递的 。