作用域和块
Scopes and blocks
在 ruby、module
、class
和 def
关键字中定义了一个新的范围。我很困惑为什么块中定义的局部变量在块外不存在。块参数是另一个作用域门吗?例如:
(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
仍然是主线程。这使得代码块的行为主要类似于闭包(它们可以访问调用者绑定):
▶ kot = 10
#⇒ 10
▶ 5.times do |i|
▷ kot = i
▷ end
▶ puts kot
#⇒ 4
希望它能有所启发。
In ruby, module
, class
, and def
keywords define a new scope.
Ruby 中有六个作用域构造:模块体、class 体、方法体和脚本体创建新的作用域,块体和 "stabby lambda" 文字体创建新的嵌套作用域.
I'm confused as to why local variables defined in a block do not exist outside of the block.
因为块体有自己的词法作用域。作用域是嵌套的,这意味着它可以访问外部作用域的局部变量,但内部作用域的变量永远不会泄漏到外部作用域。
在 ruby、module
、class
和 def
关键字中定义了一个新的范围。我很困惑为什么块中定义的局部变量在块外不存在。块参数是另一个作用域门吗?例如:
(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
仍然是主线程。这使得代码块的行为主要类似于闭包(它们可以访问调用者绑定):
▶ kot = 10
#⇒ 10
▶ 5.times do |i|
▷ kot = i
▷ end
▶ puts kot
#⇒ 4
希望它能有所启发。
In ruby,
module
,class
, anddef
keywords define a new scope.
Ruby 中有六个作用域构造:模块体、class 体、方法体和脚本体创建新的作用域,块体和 "stabby lambda" 文字体创建新的嵌套作用域.
I'm confused as to why local variables defined in a block do not exist outside of the block.
因为块体有自己的词法作用域。作用域是嵌套的,这意味着它可以访问外部作用域的局部变量,但内部作用域的变量永远不会泄漏到外部作用域。