gpt4 book ai didi

ruby - ruby 中的 block 范围

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

我的理解是 ruby​​ block 具有 block 作用域,并且在 block 内创建的所有变量将仅存在于 block 内。

案例:

 food = ['toast', 'cheese', 'wine']
food.each { |food| puts food.capitalize}
puts food

输出:

"Toast"
"Cheese"
"Wine"
"Wine"

如果您在 block (每个 block )内使用 food 变量,我的理解是它具有 block 作用域。它只存在于 block 范围内,对外部变量 food 没有任何影响。

但行为不同,在这种情况下修改了名为 food 的外部变量。这种理解是否正确,在 ruby​​ 中我们有 block 作用域吗?

最佳答案

这是 ruby​​ 1.8 的预期行为。 It was fixed in 1.9 .下面的片段使用 ruby​​ 1.9.3 运行

food = ['toast', 'cheese', 'wine']
food.each { |food| puts food.capitalize.inspect} # !> shadowing outer local variable - food
puts food.inspect
# >> "Toast"
# >> "Cheese"
# >> "Wine"
# >> ["toast", "cheese", "wine"]

你是对的, block 中的 food 的范围限定在该 block 内,并使用此名称隐藏其他变量。但是如果你对它做了一些破坏性的事情,它会反射(reflect)在原始数组中,因为它是对数组元素的引用,而不是它的副本。观察:

food = ['toast', 'cheese', 'wine']

food.each { |f| f.capitalize} # transform and discard
food # => ["toast", "cheese", "wine"]

food.each { |f| f.capitalize! } # transform destructively (bang-version)
food # => ["Toast", "Cheese", "Wine"]

关于ruby - ruby 中的 block 范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11685965/

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