在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)
jmah.. 31
您可以通过显式传入当前绑定来完成此操作:
def func(x, bdg) eval "#{x} += 1", bdg end a = 5 func(:a, binding) puts a # => 6
Christoph Sc.. 20
Ruby根本不支持"通过引用传递".一切都是对象,对这些对象的引用总是按值传递.实际上,在您的示例中,您将通过值传递Fixnum
对象的引用副本.
您的代码存在的问题是,x += 1
它不会修改传递的Fixnum
Object,而是创建一个全新且独立的对象.
我认为,Java程序员会将Fixnum
对象称为不可变的.
您可以通过显式传入当前绑定来完成此操作:
def func(x, bdg) eval "#{x} += 1", bdg end a = 5 func(:a, binding) puts a # => 6
Ruby根本不支持"通过引用传递".一切都是对象,对这些对象的引用总是按值传递.实际上,在您的示例中,您将通过值传递Fixnum
对象的引用副本.
您的代码存在的问题是,x += 1
它不会修改传递的Fixnum
Object,而是创建一个全新且独立的对象.
我认为,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'