Ruby中有四种类型的变量.
- 局部变量 ( local variable )
- 全局变量 ( global variable )
- 实例变量 ( instance variable )
- 类变量 ( class variable )
变量的命名方式决定了变量的种类.
-
局部变量
以英文小写字母
或者_
开头 -
全局变量
以$
开头 -
实例变量
以@
开头 -
类变量
以@@
开头
伪变量
除了以上四种类型以外, 还有一种名为伪变量(pseudo variable)
的特殊变量. 伪变量是 Ruby 预定义好的代表某特定值的特殊变量, 因此即使我们在程序中给伪变量赋值, 他的值不会改变. Ruby 中, nil, true, false, self 等都是伪变量. 他们表面上虽然看着像变量, 但实际的行为又与变量有差别, 因此称为伪变量
.
#!/usr/bin/ruby
# -*- coding: UTF-8 -*-
# 全局变量
# 以 $ 开头.
# 未初始化的全局变量值为 nil, 执行时, 在使用 -w 选项后, 会产生警告.
# 给全局变量赋值会被改变, 所以不建议使用全局变量.
$global_variable = 99
class Class1
def print_global
puts "全局变量在 Class1 中输出为 #$global_variable"
end
end
class Class2
def print_global
puts "全局变量在 Class2 中输出为 #$global_variable"
$global_variable = 110
puts "全局变量重新赋值: global_variable = #$global_variable"
end
# 类变量
# 以 @@ 开头, 且必须初始化才能在方法定义中使用.
# 引用一个未初始化的类变量会产生错误. 类变量在定义它的类或模块的子类或子模块中可共享使用.
# 在使用 -w 选项后, 重载类变量会产生警告.
@@_class_variable = 92
def print_class_variable()
@@_class_variable += 1
puts "类变量: class_variable += 1 -> #@@_class_variable"
end
# 实例变量
# 以 @ 开头. 未初始化的实例变量值为 nil, 执行时, 在使用 -w 选项后, 会产生警告.
@_uninitialized
def display_details()
puts "实例变量: id = #@_id, name = #@_name, age = #@_age uninitialized = #@_uninitialized"
end
# 局部变量
# 以小写字母 或 下划线 _ 开头.
# 局部变量的作用域从 class, module, def 或 do 到相应的end或者从 { 到 }
# 当调用一个未初始化的局部变量时, 它被解释为调用一个不带参数的方法.
# 对未初始化的局部变量赋值也可当作变量声明. 变量会一直存在, 直到当前作用域结束.
# 局部变量的生命周期在 Ruby 解析程序时确定.
# 局部变量如下: id, name, age 均为局部变量.
def initialize(id, name, age)
@_id = id
@_name = name
@_age = age
end
# 常量
# 以大写字母开头.
# 常量不能定义在方法内. 定义在类或模块内的常量可以从类或模块的内部访问, 定义在类或模块外的常量可以被全局访问.
# 引用一个未初始化的常量会产生错误.
# 对已经初始化的常量复制会产生警告.
VAR1 = 100
VAR2 = 200
def print_constant
puts "常量: VAR1 = #{VAR1}, VAR2 = #{VAR2}"
end
# 伪变量
# 它们是特殊的变量, 有着局部变量的外观, 但行为却像常量. 你不能给这些变量赋任何值.
# self : 调用该方法的instance
# true : ...
# false : ...
# nil : ...
# __FILE__ : ...
# __LINE__ : ...
def print_pseudo_variable()
puts "伪变量: self = #{self}, true = #{true}, false = #{false}, __FILE__ = #{__FILE__}, __LINE__ = #{__LINE__}"
end
end
instance1 = Class1.new
instance1.print_global
instance2 = Class2.new($global_variable,"xiaoMing",26)
instance2.display_details
instance2.print_global
instance2.print_class_variable
instance2.print_constant
instance2.print_pseudo_variable
执行结果
全局变量在 Class1 中输出为 99
实例变量: id = 99, name = xiaoMing, age = 26 uninitialized =
全局变量在 Class2 中输出为 99
全局变量重新赋值: global_variable = 110
类变量: class_variable += 1 -> 93
常量: VAR1 = 100, VAR2 = 200
伪变量: self = #<Class2:0x007fedbf099778>, true = true, false = false, __FILE__ = Test.ruby, __LINE__ = 78
网友评论