Ruby 变量

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 = #, true = true, false = false, __FILE__ = Test.ruby, __LINE__ = 78

你可能感兴趣的:(Ruby 变量)