gpt4 book ai didi

ruby - 在 proc 中设置全局

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

我一直在努力更好地理解 Ruby,但我遇到了一些问题:

$SAFE = 1
puts $SAFE # 1
proc {
$SAFE = 2
puts $SAFE # 2
}.call
puts $SAFE # 1

以上代码部分取自 eRB 的源代码并重写以更好地突出示例。基本上在 proc 中,可以将 $SAFE 的值设置为任何想要的值,并且在 proc 之后,SAFE 的值返回到它在 proc 之前的值。

如果我不使用单词 $SAFE,而是将其更改为不同的单词,例如 $DOOR:

$DOOR = 1
puts $DOOR
proc {
$DOOR = 2
puts $DOOR
}.call
puts $DOOR

那么$DOOR在proc之后的值是2而不是1。为什么两个例子有区别?

最佳答案

这很简单,真的:$SAFE 的行为不像您期望的全局变量那样是因为它不是全局变量。这是一个神奇的 unicorn thingamajiggy。

Ruby 中有很多神奇的 unicorn thingamajiggies,不幸的是,它们没有很好的文档记录(事实上,根本没有文档记录),因为替代 Ruby 实现的开发人员发现了困难的方法。这些 thingamajiggies 的行为各不相同,而且(看似)不一致,而且它们几乎唯一的两个共同点是它们看起来像全局变量,但行为却不像它们。

有些具有局部作用域。有些具有线程本地范围。一些神奇的变化没有任何人分配给他们。有些对解释器有神奇的意义,可以改变语言的行为方式。有些附加了其他奇怪的语义。

$SAFE 几乎具有以上所有:它是线程局部的,这意味着如果您在一个线程中更改它,它不会影响其他线程。它是本地的,这意味着如果您在本地范围内更改它(如类、模块、方法或 block ),它不会影响外部范围(正如您所发现的)。它对解释器有神奇的意义,因为将它设置为不同于 0 的值会使某些事情不起作用。而且它还有其他奇怪的语义,因为您只能增加它的值,永远不能减少它。

关于ruby - 在 proc 中设置全局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2278454/

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