范围如何在Ruby中运行?

use*_*541 0 ruby ruby-on-rails

我不能把这想象成一个主要在C工作的人.

以下代码如何合理?

if true
    hi = "hello"
end

puts hi
Run Code Online (Sandbox Code Playgroud)

我习惯hi不在范围内puts,所以它会出错.Ruby中的作用域如何工作.我似乎无法找到解释它的明确教程.

即使这是有效的,这是好的做法吗?

Jör*_*tag 6

在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
Run Code Online (Sandbox Code Playgroud)