Ruby中的'通过引用传递参数'?

时间:2008-10-02 09:33:17

标签: ruby parameter-passing pass-by-reference

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

6 个答案:

答案 0 :(得分:31)

您可以通过显式传入当前绑定来完成此操作:

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

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

答案 1 :(得分:19)

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

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

我认为,Java程序员会调用Fixnum个对象不可变

答案 2 :(得分:11)

在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

答案 3 :(得分: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'

答案 4 :(得分:2)

http://ruby-doc.org/core-2.1.5/Fixnum.html

  

Fixnum对象具有直接价值。这意味着当他们被分配或   作为参数传递,传递实际对象,而不是引用   那个对象。

Ruby is pass by value

答案 5 :(得分:0)

但是,似乎像哈希这样的复合对象是通过引用传递的:

fp = {}
def changeit(par)
  par[:abc] = 'cde'
end

changeit(fp)

p fp

给予

{:abc=>"cde"}