这个问题已经在这里有了答案:




已关闭8年。






在此示例中:

def test
  verb = 'nothing'
  yield verb
  puts verb
end

test {|verb| verb = 'something'}

它将打印“无”。

是否可以将其更改为“某物”?

谢谢

最佳答案

您必须记住,Ruby中的变量只是对对象的引用。每个引用都独立于任何其他引用,尽管它们可以引用相同的对象。

要记住的另一件事是,块的范围是定义它的范围。因此,对于您的块,verb不在范围内(因为它是在verb所在的方法之外定义的)。

除了stephenjudkins提到的具有约束力的技巧外,还有两种方法可以做您想要的事情。一种只是分配verb:

def test
  verb = 'nothing'
  verb = yield verb
  puts verb
end

这很直接地完成了您想要的操作,并且实际上是实现此操作的最佳方法。

另一种方法是直接更改传入的对象:
test {|verb| verb.replace 'something'}

但是,我不建议这样做,因为它实际上会更改字符串本身,而不是仅将新字符串分配给变量。因此,在引用相同字符串对象的其他地方,它将包含新文本。在您的示例中,这不是问题,但在任何实际程序中都需要等待大量错误的发生。

关于ruby - 从 ruby 块更改原始变量? [复制],我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3268599/

10-13 07:45
查看更多