[英]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个作用域-
def
创建新的作用域 class
创建一个新的范围 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.