2008-10-02 40 views
25

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

回答

30

您可以明确地传递当前绑定实现这一点:

def func(x, bdg) 
    eval "#{x} += 1", bdg 
end 

a = 5 
func(:a, binding) 
puts a # => 6 
18

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

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

我想,Java程序员会打电话给Fixnum对象不可变的

+3

当变量和参数只能包含对象的引用时,我没有得到Ruby不会通过ref传递的信息。说引用是按值传递的,就像说对象是通过引用传递一样。 – 2009-05-03 13:17:08

+2

@Damien:不,它不是。通过引用(例如,在C++,C#,PHP,Perl中),您可以*将*分配给变量,就像您在外部范围中分配给它一样。你在这里试图做的事情可能是真实的传递;但不包括传递参考值。 – newacct 2012-04-23 17:34:27

+6

你是对的,我正在阅读克里斯托弗的回答和我的评论,我不同意我的2009年自我。嗯... – 2012-04-24 01:50:29

10

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

你可以试试下面的诀窍:

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'