Ruby on rails 范围在Ruby中是如何工作的?

Ruby on rails 范围在Ruby中是如何工作的?,ruby-on-rails,ruby,Ruby On Rails,Ruby,作为一个主要在C工作的人,我无法理解这一点 下面的代码如何合理 if true hi = "hello" end puts hi 我习惯于hi不在puts的范围内,所以它会出错。Ruby中的作用域是如何工作的。我似乎找不到一个清晰的教程来解释它 即使这是有效的,这是一个好的实践吗?在Ruby中,我们有4个作用域- 顶级范围 def创建一个新的作用域 类创建一个新范围 模块创建一个新的作用域。 在您的例子中,hi是一个在顶级范围内创建的局部变量。正如我上面所说的,如果不创建新的范围,那

作为一个主要在C工作的人,我无法理解这一点

下面的代码如何合理

if true
    hi = "hello"
end

puts hi
我习惯于hi不在puts的范围内,所以它会出错。Ruby中的作用域是如何工作的。我似乎找不到一个清晰的教程来解释它


即使这是有效的,这是一个好的实践吗?

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

顶级范围 def创建一个新的作用域 类创建一个新范围 模块创建一个新的作用域。 在您的例子中,hi是一个在顶级范围内创建的局部变量。正如我上面所说的,如果不创建新的范围,那么它将使用默认范围,即顶级范围,而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和it对象一无所知。类似地,在baz内部,我创建了一个新的变量栏,但外部不知道baz的作用域,因此顶层也反对baz。

在Ruby中,有5个作用域:

脚本范围 模块范围 类范围 方法范围 块范围 块作用域嵌套,其他作用域不嵌套。块可以关闭它们的词汇环境,其他块则不能。IOW:它们不仅嵌套在词汇环境中,也就是说,可以从词汇环境中访问变量,甚至可以在周围环境不存在后继续这样做

与其他一些语言不同,Ruby没有局部变量的顶级或全局作用域。最大的范围是脚本范围,但这不是全局范围,它仅限于单个脚本。通常,脚本和文件是一样的,但是有些Ruby实现不使用文件,所以像file scope这样的术语会产生误导

局部变量从解析其定义的点开始定义,并从执行其定义的点开始初始化。在这两者之间,当它们被定义但未初始化时,它们的计算结果为零

考虑这个稍加修改的示例:

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

块也会创建一个新的作用域。顶级作用域是否在整个def中都可用?如果我在任何地方创建一个变量,即使是在一个带有for循环的嵌套很深的If树中,也可以在它之外使用它?@user212541 No def创建一个新的作用域,这是一个全新的、不同于顶级的作用域。关于你的第二个问题,是的。