在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