Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 范围和块_Ruby_Scope - Fatal编程技术网

Ruby 范围和块

Ruby 范围和块,ruby,scope,Ruby,Scope,在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 # => Na

在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"

您可能认为代码块是类的惰性实例

您的第二个示例使用了
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
当您将代码块传递给,例如,
枚举器
实例的每个方法时:

(1..2).each { |n| numer = 'czesc' }
正在该
枚举器的上下文中计算代码块。不过,默认的接收器,
self
,仍然是主线程。这使得代码块的行为更像闭包(它们可以访问调用方绑定):


希望它能提供一些启示。

您可能会将代码块看作类的惰性实例

您的第二个示例使用了
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
当您将代码块传递给,例如,
枚举器
实例的每个
方法时:

(1..2).each { |n| numer = 'czesc' }
正在该
枚举器的上下文中计算代码块。不过,默认的接收器,
self
,仍然是主线程。这使得代码块的行为更像闭包(它们可以访问调用方绑定):

希望它能给我们一些启示

在ruby中,
module
class
def
关键字定义了一个新的范围

Ruby中有六个作用域构造:模块体、类体、方法体和脚本体创建新的作用域,块体和“Thanky lambda”文本体创建新的嵌套作用域

我不明白为什么块中定义的局部变量不存在于块之外

因为块体有自己的词法范围。作用域是嵌套的,这意味着它可以从外部作用域访问局部变量,但内部作用域的变量永远不会泄漏到外部作用域

在ruby中,
module
class
def
关键字定义了一个新的范围

Ruby中有六个作用域构造:模块体、类体、方法体和脚本体创建新的作用域,块体和“Thanky lambda”文本体创建新的嵌套作用域

我不明白为什么块中定义的局部变量不存在于块之外


因为块体有自己的词法范围。作用域是嵌套的,这意味着它可以从外部作用域访问局部变量,但内部作用域的变量永远不会泄漏到外部作用域。

humm。。继续玩Ruby。。太神奇了……)哼。。继续玩Ruby。。太神奇了……)当你说“脚本主体”时,你指的是不同文件中的代码吗?此外,我经常读到关于我列出的“三个范围门”的文章。你知道我在哪里可以找到这些信息吗?它可以引导我找到其他宝石!是的,与其他语言不同,在这些语言中,顶层的局部变量实际上是全局的,在Ruby中,它们是脚本(即文件)的局部变量。我猜“范围门”是指它们创建新的范围,而块和
->
lambda文本嵌套。当你说“脚本体”时,你指的是不同文件中的代码吗?此外,我经常读到关于我列出的“三个范围门”的文章。你知道我在哪里可以找到这些信息吗?它可以引导我找到其他宝石!是的,与其他语言不同,在这些语言中,顶层的局部变量实际上是全局的,在Ruby中,它们是脚本(即文件)的局部变量。我猜“范围门”是指它们创建新的范围,而块和
->
lambda文本嵌套。关于延迟评估代码块的重要信息。那么,就我而言,这是个糟糕的例子!关于延迟评估代码块的重要信息。那么,就我而言,这是个糟糕的例子!