Ruby中的'通过引用传递参数'?
-
03-07-2019 - |
题
在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按值传递。
但是,似乎复合对象(如哈希)通过引用传递:
fp = {}
def changeit(par)
par[:abc] = 'cde'
end
changeit(fp)
p fp
给出
{:abc=>"cde"}
不隶属于 StackOverflow