gpt4 book ai didi

ruby - 作用域和 block

转载 作者:太空宇宙 更新时间:2023-11-03 17:32:43 25 4
gpt4 key购买 nike

在 ruby​​ 中,moduleclassdef 关键字定义了一个新的作用域。我很困惑为什么 block 中定义的局部变量在 block 外不存在。 block 参数是另一个作用域门吗?例如:

(1..2).each { |n| numer = 'czesc' }
numer # => NameError: undefined local variable or method `czesc' for main:Object

或者更简单地说:

def kon; end
kon { kot = 3 }
kot # => NameError: undefined local variable or method `kot' for main:Object

我想,也许它没有被持久化,因为它是在方法的参数中定义的,但以下适用于普通参数:

def pokaz(cos)
p cos
end
pokaz(co = "to")
co # => "to"

最佳答案

您可能会将代码块视为 Proc 的惰性实例类(class)。

您使用 kon/kot 的第二个示例实际上并不符合您的预期。您为函数 kon 提供代码块。除非请求,否则此代码块不会被评估。在您的代码段中,它永远不会被评估。看:

▶ def kon; end
#⇒ :kon
▶ kon { puts 'I am here' }
#⇒ nil

你传递了一个代码块。美好的。如果需要,现在 kon 应该调用它:

▶ def kon; yield ; end
#⇒ :kon
▶ kon { puts 'I am here' }
# I am here
#⇒ nil

当您将代码块传递给 Enumerator 实例的 each 方法时:

(1..2).each { |n| numer = 'czesc' }

代码块正在此 Enumerator 的上下文中进行评估。不过,默认接收器 self 仍然是主线程。这使得代码块的行为主要类似于闭包(它们可以访问调用者绑定(bind)):

▶ kot = 10  
#⇒ 10
▶ 5.times do |i|
▷ kot = i
▷ end
▶ puts kot
#⇒ 4

希望它能有所启发。

关于ruby - 作用域和 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29541443/

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