在Ruby中,是否可以通过引用传递具有值类型语义的参数(例如Fixnum)? 我正在寻找类似于C#的'ref'关键字的东西。'在Ruby中通过引用传递参数'?
实施例:
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)? 我正在寻找类似于C#的'ref'关键字的东西。'在Ruby中通过引用传递参数'?
实施例:
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不会通过ref传递的信息。说引用是按值传递的,就像说对象是通过引用传递一样。 – 2009-05-03 13:17:08
@Damien:不,它不是。通过引用(例如,在C++,C#,PHP,Perl中),您可以*将*分配给变量,就像您在外部范围中分配给它一样。你在这里试图做的事情可能是真实的传递;但不包括传递参考值。 – newacct 2012-04-23 17:34:27
你是对的,我正在阅读克里斯托弗的回答和我的评论,我不同意我的2009年自我。嗯... – 2012-04-24 01:50:29