Ruby ';通过引用传递参数';用红宝石?

Ruby ';通过引用传递参数';用红宝石?,ruby,parameter-passing,pass-by-reference,Ruby,Parameter Passing,Pass By Reference,在Ruby中,是否可以通过引用传递具有值类型语义的参数(例如Fixnum)? 我正在寻找类似于C#'sref'关键字的东西 例如: 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根本不支持“通过引用传递”。一切都是一个对象,对这些对象的引用总是按值传递。

在Ruby中,是否可以通过引用传递具有值类型语义的参数(例如Fixnum)? 我正在寻找类似于C#'sref'关键字的东西

例如:

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
对象

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


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

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

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

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

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

Fixnum对象具有立即值。这意味着当它们被分配或 作为参数传递时,将传递实际对象,而不是对的引用 那个物体


另外。

但是,复合对象(如哈希)似乎是通过引用传递的:

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

changeit(fp)

p fp
给予


当变量和参数只能包含对对象的引用时,我不明白Ruby不能通过ref传递什么。说引用是通过值传递的,和说对象是通过引用传递的是一样的。@Damien:不是。传递引用(例如,C++、C语言、PHP、Perl)允许您分配变量,就像在外部范围中分配给它一样。您在这里试图做的是通过引用进行真正的传递;但不是通过传递参考文献的价值。你是对的,我正在再次阅读克里斯托夫的答案和我的评论,我不同意我2009年的观点。嗯……从技术上讲,这也是在写入时替换变量(以及列表中的引用)。@itarato a和x在其整个生命周期中都指向同一个列表,因此没有任何内容替换任何变量,但列表的第一个条目被更改为指向不同的数字。我喜欢这个技巧,因为使用列表比使用包装类.get/.set方法感觉精神上的开销要少,但这确实意味着您需要记住用[0]解除对它的引用。因为这是一个可怕的预兆:涉及各种打字错误、安全性和丑陋风险。最好使用某种包装器,并将“绑定”保留为“pry”之类的内容。散列按值传递,但值是对可变对象的引用。所以fp总是指向同一个哈希对象实例,但changeit修改其内容。你可以通过打印FP.ObjutsId和PAR.ObjutsId来确认这一点。你不能仅仅通过分配一个不同的哈希值来影响FP的值,即“通过引用”允许的值。
{:abc=>"cde"}