14、Ruby 变量

变量是计算机语言中能储存计算结果或能表示值抽象概念。变量可以通过变量名访问

Ruby 语言支持五种类型的变量:

1、 **一般小写字母、下划线开头:**变量(Variable);
2、 ** $ 开头:**全局变量(Globalvariable);
3、 **@开头:**实例变量(Instancevariable);
4、 **@@开头:**类变量(Classvariable),类变量被共享在整个继承链中;
5、 **大写字母开头:**常数(Constant);

其实这些变量我们在前面的章节中或多或少都有了解过,本章我们将详细学习者五种类型的变量

Ruby 全局变量

全局变量以 ** $ ** 开头。

未初始化的全局变量的默认值为 nil

使用 -w 选项后,未初始化的全局变量会产生警告

因为全局变量是所有范围可见的,也就说任何地方都能改变她的值,因此不建议使用全局变量。

main.rb

# !/usr/bin/ruby -w
# -*- encoding:utf-8 -*-
# filename: main.rb
# author: DDKK.COM 弟弟快看,程序员编程资料站(www.ddkk.com)
# Copyright © 2015-2065 www.ddkk.com. All rights reserved.

$global_variable = 13

class HelloWorld

  def print_global
      puts "全局变量在 HelloWorld 中输出为 #$global_variable"
  end
end

class HelloWorld2

  def print_global
      puts "全局变量在 HelloWorld 中输出为 #$global_variable"
  end
end

class1obj = HelloWorld.new
class1obj.print_global
$global_variable = 17

class2obj = HelloWorld2.new
class2obj.print_global

$global_variable = 19

puts "全局变量为 : #$global_variable"

运行范例 »

$ global_variable 是全局变量

注意: Ruby 语言中可以通过在变量或常量前面放置 # 字符,来访问任何变量或常量的值

运行以上 Ruby 脚本,输出结果如下

$ ruby main.rb
全局变量在 HelloWorld 中输出为 13
全局变量在 HelloWorld 中输出为 17
全局变量为 : 19

Ruby 实例变量

实例变量以 @ 开头。

未初始化的实例变量的的默认值为 nil

在使用 -w 选项后,未初始化的实例变量会产生警告信息

main.rb

# !/usr/bin/ruby -w
# -*- encoding:utf-8 -*-
# filename: main.rb
# author: DDKK.COM 弟弟快看,程序员编程资料站(www.ddkk.com)
# Copyright © 2015-2065 www.ddkk.com. All rights reserved.
class Company
    def initialize(id, name, addr)
       @comp_id=id          
       @comp_name=name
       @comp_addr=addr
    end
    def display_details()
       puts "Company id #@comp_id"
       puts "Company name #@comp_name"
       puts "Company address #@comp_addr"
    end
end

# 创建对象
comp1=Company.new(1, "百度", "北京市海淀区")
comp2=Company.new(2, "DDKK.COM 弟弟快看,程序员编程资料站", "北京市东城区")

# 调用方法
comp1.display_details()
comp2.display_details()

运行范例 »

@cust_id 、 @cust_name 和 @cust_addr 是实例变量

运行以上 Ruby 范例,输出结果如下

$ ruby main.rb
Company id 1
Company name 百度
Company address 北京市海淀区
Company id 2
Company name DDKK.COM 弟弟快看,程序员编程资料站
Company address 北京市东城区

Ruby 类变量

类变量以 @@ 开头,且必须初始化后才能在方法中使用

类变量在定义它的类或模块的子类或子模块中可共享使用。

引用一个未初始化的类变量会产生错误。

在使用 -w 选项后,重载类变量会产生警告

main.rb

# !/usr/bin/ruby -w
# -*- encoding:utf-8 -*-
# filename: main.rb
# author: DDKK.COM 弟弟快看,程序员编程资料站(www.ddkk.com)
# Copyright © 2015-2065 www.ddkk.com. All rights reserved.
class Company

    @@no_of_company = 0  

    def initialize(id, name, addr)
       @comp_id=id   
       @comp_name=name
       @comp_addr=addr

       @@no_of_company += 1
    end

    def display_details()
       puts "Company id #@comp_id"
       puts "Company name #@comp_name"
       puts "Company address #@comp_addr"
    end

    def total_no_of_company()
        puts "Total number of company: #@@no_of_company"
    end

end
comp1=Company.new(1, "百度", "北京市海淀区")
comp1.total_no_of_company()

comp2=Company.new(2, "DDKK.COM 弟弟快看,程序员编程资料站", "北京市东城区")
comp2.total_no_of_company()

运行范例 »

上面范例中,@@no_of_customers 是类变量 id、name 和 addr 是局部变量

运行以上 Ruby 范例,输出结果如下

$ ruby main.rb
Total number of company: 1
Total number of company: 2

Ruby 局部变量

局部变量以小写字母或下划线(_) 开头。 局部变量的作用域从 class、module、def、do 到相对应的结尾或者从左大括号到右大括号 {}

当调用一个未初始化的局部变量时,它被解释为调用一个不带参数的方法

对未初始化的局部变量赋值也可以当作是变量声明。

局部变量的生命周期在 Ruby 解析程序时确定 局部变量会一直存在,直到当前域结束为止。

在上面的范例中,initialize 方法中的 id、name 和 addr 是局部变量

Ruby 常量

Ruby 语言中的常量要遵守以下规则

1、 Ruby语言中的常量以大写字母开头;
2、 定义在类或模块内的常量可以从类或模块的内部访问;
3、 定义在类或模块外的常量可以被全局访问;
4、 常量不能定义在方法内;
5、 引用一个未初始化的常量会产生错误;
6、 对已经初始化的常量赋值会产生警告;

main.rb

# !/usr/bin/ruby -w
# -*- encoding:utf-8 -*-
# filename: main.rb
# author: DDKK.COM 弟弟快看,程序员编程资料站(www.ddkk.com)
# Copyright © 2015-2065 www.ddkk.com. All rights reserved.

GLOBAL_CONST_VAR = "www.ddkk.com"   

class HelloWorld
    VAR1 = 1   
    VAR2 = 3

    def show
        puts "第一个常量的值为 #{VAR1}"
        puts "第二个常量的值为 #{VAR2}"
        puts "全局的常量 GLOBAL_CONST_VAR 值为: #{GLOBAL_CONST_VAR}"
    end
end
object=HelloWorld.new()
object.show

运行范例 »

定义在模块内的常量 定义在类内部的常量

运行以上 Ruby 范例,输出结果如下

$ ruby main.rb
第一个常量的值为 1
第二个常量的值为 3
全局的常量 GLOBAL_CONST_VAR 值为: www.ddkk.com

Ruby 特殊变量

Ruby 语言中有一些特殊的变量,它们有着局部变量的外观,但行为却像常量。

而且不能给这些特殊变量赋任何值。

下面是Ruby 语言中特殊的变量

  • self: 当前方法的接收器对象
  • true: 代表 true 的值
  • false: 代表 false 的值
  • nil: 代表 undefined 的值
  • FILE: 当前源文件的名称
  • LINE: 当前行在源文件中的编号