gpt4 book ai didi

ruby - 了解此 Ruby 示例中的按值传递与引用传递

转载 作者:数据小太阳 更新时间:2023-10-29 08:43:45 25 4
gpt4 key购买 nike

看完Is ruby pass by reference or value?我学到了很多东西,但我的问题比阅读前更多(我认为这很好)。

考虑下面的例子

def foo(bar) 
bar = 'reference'
end
baz = 'value'
foo(baz)
puts "Ruby is pass-by-#{baz}"

输出Ruby 是按值传递

这是我试图剖析其工作原理的尝试:

首先,在全局范围内,baz 的值为value

现在 foo 接受一个参数,无论您传递给它什么,都是在 local 级别上。

因此,当我们传入 baz 时,还有另一个 baz 等于 reference 但这是在 local level ,因此,当我们将其置于全局 级别时,它会打印value

现在考虑另一个例子

def foo(bar)
bar.replace 'reference'
end
baz = 'value'
foo(baz)
puts "Ruby is pass-by-#{baz}"

输出

Ruby 是按引用传递的

如果我上面说的是真的,这里的.replace方法是不是改变了全局的baz?我的解释正确吗?请随时指出我尝试中的任何错误,我不知道我是否在正确的轨道上。

谢谢!

编辑

更多魔法

def my_foo(a_hash)
a_hash["test"]="reference"
end;

hash = {"test"=>"value"}
my_foo(hash)
puts "Ruby is pass-by-#{hash["test"]}"

最佳答案

Ruby 是按值传递的,但值是对对象的引用。

在您的第一个实验中,baz 是对字符串 "value" 的引用。当您调用 foo 时,bar 被初始化为 baz 的副本(即引用的副本)。然后用对字符串 "reference" 的引用覆盖 bar。由于 bar 是一个副本,覆盖它不会改变 baz

在您的第二个实验中,baz 是对字符串 "value" 的引用,并且 bar 被初始化为 baz 当你调用 foo 时。这次您不覆盖 bar,而是在其上调用一个方法。虽然 barbaz 的副本,但它们指的是同一个对象(字符串 "value")。调用该方法会更改该对象的状态。然后,您在 baz 上调用 to_s(间接地,将其代入 "Ruby is pass-by-#{baz}"),并且 to_s 返回新状态。

您的第三个实验与第二个很相似。在方法中,您更改引用副本引用的对象的状态,然后,在方法外部,您通过原始引用读回新状态。

关于ruby - 了解此 Ruby 示例中的按值传递与引用传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39250963/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com