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