详细解析Ruby中的变量

2019-09-25 09:43:34王冬梅

 变量持有要使用的程序的数据的存储位置。

Ruby支持的有五种类型的变量。在前面的章节中已经经历了一个简短描述以及这些变量。本章中介绍的这五种类型的变量。
Ruby的全局变量:

全局变量以$开头。未初始化的全局变量的值是零,并使用-w选项产生警告。

全局变量的赋值会改变全局状态。这是不推荐使用全局变量。他们使得程序的含义模糊。

下面是一个例子显示使用全局变量。

#!/usr/bin/ruby

$global_variable = 10
class Class1
 def print_global
   puts "Global variable in Class1 is #$global_variable"
 end
end
class Class2
 def print_global
   puts "Global variable in Class2 is #$global_variable"
 end
end

class1obj = Class1.new
class1obj.print_global
class2obj = Class2.new
class2obj.print_global

这里$global_variable是一个全局变量。这将产生以下结果:

注意: 在Ruby中,把一个哈希号(#)字符,在任意变量或常量之前能够访问它的值。

Global variable in Class1 is 10
Global variable in Class2 is 10

Ruby的实例变量:

实例变量@开始。未初始化的实例变量的值是零,并产生警告-w选项。

下面是一个例子显示使用实例变量。

#!/usr/bin/ruby

class Customer
  def initialize(id, name, addr)
   @cust_id=id
   @cust_name=name
   @cust_addr=addr
  end
  def display_details()
   puts "Customer id #@cust_id"
   puts "Customer name #@cust_name"
   puts "Customer address #@cust_addr"
  end
end

# Create Objects
cust1=Customer.new("1", "John", "Wisdom Apartments, Ludhiya")
cust2=Customer.new("2", "Poul", "New Empire road, Khandala")

# Call Methods
cust1.display_details()
cust2.display_details()

这里的@cust_id, @cust_name 和 @cust_addr 都是实例变量。这将产生以下结果:

Customer id 1
Customer name John
Customer address Wisdom Apartments, Ludhiya
Customer id 2
Customer name Poul
Customer address New Empire road, Khandala

Ruby的类变量:

类变量以@@开始,它们可以被用来在方法定义之前必须初始化。

引用未初始化的类变量产生错误。类变量之间共享其中的类变量定义的类或模块的的后代。

覆盖类变量产生警告-w选项。

下面是一个例子显示使用类变量:

#!/usr/bin/ruby

class Customer
  @@no_of_customers=0
  def initialize(id, name, addr)
   @cust_id=id
   @cust_name=name
   @cust_addr=addr
  end
  def display_details()
   puts "Customer id #@cust_id"
   puts "Customer name #@cust_name"
   puts "Customer address #@cust_addr"
  end
  def total_no_of_customers()
    @@no_of_customers += 1
    puts "Total number of customers: #@@no_of_customers"
  end
end

# Create Objects
cust1=Customer.new("1", "John", "Wisdom Apartments, Ludhiya")
cust2=Customer.new("2", "Poul", "New Empire road, Khandala")

# Call Methods
cust1.total_no_of_customers()
cust2.total_no_of_customers()