推荐答案
在 Ruby 中,局部变量、实例变量、类变量和全局变量的区别主要体现在作用域和生命周期上:
- 局部变量:以
小写字母或_开头,作用域限定在定义它的块、方法或类中。局部变量在块、方法或类结束后会被销毁。 - 实例变量:以
@开头,作用域限定在类的实例中。每个实例都有自己独立的实例变量,实例变量的生命周期与实例的生命周期一致。 - 类变量:以
@@开头,作用域限定在类及其子类中。类变量在类的所有实例之间共享,生命周期与类的生命周期一致。 - 全局变量:以
$开头,作用域是整个程序。全局变量在程序的任何地方都可以访问,生命周期与程序的生命周期一致。
本题详细解读
局部变量
局部变量是最常见的变量类型,通常用于存储临时数据。它们的作用域非常有限,只能在定义它们的块、方法或类中访问。一旦超出作用域,局部变量就会被销毁。
def example_method local_var = "I'm a local variable" puts local_var end example_method # puts local_var # 这里会报错,因为 local_var 超出了作用域
实例变量
实例变量属于类的实例,每个实例都有自己独立的实例变量。实例变量在类的任何方法中都可以访问,并且它们的生命周期与实例的生命周期一致。
// www.javascriptcn.com code example
class MyClass
def initialize
@instance_var = "I'm an instance variable"
end
def print_var
puts @instance_var
end
end
obj = MyClass.new
obj.print_var # 输出: I'm an instance variable类变量
类变量在类的所有实例之间共享,并且可以在类的任何方法中访问。类变量的生命周期与类的生命周期一致,即使类的实例被销毁,类变量仍然存在。
// www.javascriptcn.com code example
class MyClass
@@class_var = "I'm a class variable"
def self.print_var
puts @@class_var
end
end
MyClass.print_var # 输出: I'm a class variable全局变量
全局变量可以在程序的任何地方访问,无论它们在何处定义。全局变量的生命周期与程序的生命周期一致,因此它们在整个程序运行期间都有效。
$global_var = "I'm a global variable" def print_global_var puts $global_var end print_global_var # 输出: I'm a global variable
总结
- 局部变量:作用域最小,生命周期最短。
- 实例变量:作用域限定在类的实例中,生命周期与实例一致。
- 类变量:作用域限定在类及其子类中,生命周期与类一致。
- 全局变量:作用域最大,生命周期最长。