2008-10-02 16 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'