繁体   English   中英

范围在Ruby中如何工作?

[英]How does scope work in Ruby?

我不能认为这是主要从事C语言工作的人。

以下代码如何合理?

if true
    hi = "hello"
end

puts hi

我已经习惯了hi的范围不是puts ,所以它会报错。 Ruby中的作用域如何工作。 我似乎找不到清晰的教程来解释它。

即使那是有效的,这是一个好习惯吗?

在Ruby中,有5个作用域:

  • 脚本范围
  • 模块范围
  • 班级范围
  • 方法范围
  • 块范围

块范围嵌套,其他范围不嵌套。 块可以关闭其词法环境,而其他则不能。 (IOW:它们不仅嵌套在其词法周围的环境中,即可以从其词法周围的环境访问变量,而且甚至可以在该周围环境不再存在后继续这样做。)

与某些其他语言不同,Ruby没有局部变量的顶级或全局范围。 “最大”作用域是脚本作用域,但这不是全局作用域,它仅限于单个脚本。 (通常,脚本与文件相同,但是有些Ruby实现不使用文件,因此“文件范围”之类的术语会产生误导。)

解析其定义的位置定义局部变量,并从执行其定义的位置对其进行初始化。 在两者之间,当定义但未初始化它们时,它们的值为nil

请考虑以下示例:

if false
  hi = 'hello'
end

hi
# => nil
# hi is defined here, because its definition was parsed

if true
  hi = 'olleh'
end

hi
# => 'olleh'
# hi is initialized here, because its definition was executed

在Ruby中,我们有4个作用域-

  1. 顶级范围
  2. def创建新的作用域
  3. class创建一个新的范围
  4. module创建一个新的作用域。

在您的情况下, hi是已在顶级范围中创建的局部变量。 正如我上面所说的, if不创建新的作用域,那么它将使用默认作用域(即顶级作用域) ,而hi是在顶级作用域中创建的。

范例:

foo = 12

def baz
  p foo # undefined local variable or method `foo' 
  bar = 2 
end

bar # undefined local variable or method `bar'

由于def创建了一个全新的范围,因此在baz内部,该范围对foo及其对象一无所知。 类似地,在baz内部,我创建了一个新的变量bar ,但从外部不知道baz的范围,因此顶层也反对bar

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM