1. 程式人生 > >Ruby學習之類中變數的定義和使用

Ruby學習之類中變數的定義和使用

上篇文章呢,我們簡單看了下類和方法以及物件的定義和使用,並且簡單的瞭解了類中的變數的幾種型別,這次我們就來簡單的看一下。

Ruby變數的官方定義就是持有可被任何程式使用的任何資料的儲存位置,它有五種型別:

  • 一般小寫字母、下劃線開頭:變數(Variable)。
  • $開頭:全域性變數(Global variable)。
  • @開頭:例項變數(Instance variable)。
  • @@開頭:類變數(Class variable)類變數被共享在整個繼承鏈中
  • 大寫字母開頭:常數(Constant)。

咱們先來看下全域性變數,它是以 $ 開頭,未初始化的全域性變數的值為 nil

,在使用 -w 選項後,會產生警告,當我們給全域性變數賦值會改變全域性狀態,所以不建議使用全域性變數,來看下全域性變數的具體用法:

#!/usr/bin/ruby
# -*- coding: UTF-8 -*-
 
$global = 10
class Class1
  def print_global
      puts "全域性變數在 Class1 中輸出為 #$global"
  end
end
class Class2
  def print_global
      puts "全域性變數在 Class2 中輸出為 #$global"
  end
end
 
class1obj = Class1.new
class1obj.print_global
class2obj = Class2.new
class2obj.print_global

上述程式碼中的$global就是全域性變數。

咱們再來看下例項變數,它是以 @ 開頭,如果未初始化的例項變數的值為 nil,在使用 -w 選項後,會產生警告,來看下用法:

#!/usr/bin/ruby
 
class Lu
   def initialize(id, name, sex)
      @lu_id=id
      @lu_name=name
      @lu_addr=sex
   end
   def display_details()
      puts "人物 id: #@lu_id"	#輸出資訊方式
      puts "人物 name: #@lu_name"
      puts "人物 sex: #@lu_addr"
    end
end

# 建立物件
luyaran = Lu.new("1","luyaran","girl")
cuijinpeng = Lu.new("2","cuijinpeng","boy")
 
# 呼叫方法
luyaran.display_details()
cuijinpeng.display_details()

上述程式碼中的@lu_id、@lu_name、@lu_addr都是例項變數。

接下來看下類變數,它是以 @@ 開頭且必須初始化後才能在方法定義中使用,如果引用一個未初始化的類變數會產生錯誤,類變數在定義它的類或模組的子類或子模組中可共享使用,我們在使用 -w 選項後,過載類變數會產生警告,來看下用法:

#!/usr/bin/ruby
 
class Lu
   @@num_person=0
   def initialize(id, name, sex)
      @lu_id=id
      @lu_name=name
      @lu_addr=sex
   end
   def display_details()
      puts "人物 id: #@lu_id"	#輸出資訊方式
      puts "人物 name: #@lu_name"
      puts "人物 sex: #@lu_addr"
    end
    def total_no_of_customers()
       @@num_person += 1
       puts "人物數量: #@@num_person"
    end
end

# 建立物件
luyaran = Lu.new("1","luyaran","girl")
cuijinpeng = Lu.new("2","cuijinpeng","boy")
 
# 呼叫方法
luyaran.display_details()
luyaran.total_no_of_customers()
cuijinpeng.display_details()
cuijinpeng.total_no_of_customers()

上述程式碼中的@@num_person,就算是類變數。

咱們再來看區域性變數,它是以小寫字母或下劃線 _ 開頭,作用域從 class、module、def 或 do 到相對應的結尾或者從左大括號到右大括號 {},當我們呼叫一個未初始化的區域性變數時,它被解釋為呼叫一個不帶引數的方法,我們對未初始化的區域性變數賦值也可以當作是變數宣告,並且它會一直存在,直到當前域結束為止,它的生命週期在 Ruby 解析程式時確定,來看下例項:

#!/usr/bin/ruby
 
class Lu
   @@num_person=0
   def initialize(id, name, sex)
      @lu_id=id
      @lu_name=name
      @lu_addr=sex
   end
   def display_details()
      puts "人物 id: #@lu_id"	#輸出資訊方式
      puts "人物 name: #@lu_name"
      puts "人物 sex: #@lu_addr"
    end
    def total_no_of_customers()
       @@num_person += 1
       puts "人物數量: #@@num_person"
    end
end

# 建立物件
luyaran = Lu.new("1","luyaran","girl")
cuijinpeng = Lu.new("2","cuijinpeng","boy")
 
# 呼叫方法
luyaran.display_details()
luyaran.total_no_of_customers()
cuijinpeng.display_details()
cuijinpeng.total_no_of_customers()

上述例項中的id, name, sex就算是區域性變數。

還有就是常量,它以大寫字母開頭,並且定義在類或模組內的常量可以從類或模組的內部訪問,定義在類或模組外的常量可以被全域性訪問,它不能定義在方法內,我們引用一個未初始化的常量會產生錯誤,對已經初始化的常量賦值會產生警告,來看下用法:

#!/usr/bin/ruby

class Test
   VAR1 = 1
   VAR2 = 2
   def show
       puts "第一個常量的值為 #{VAR1}"
       puts "第二個常量的值為 #{VAR2}"
   end
end
 
# 建立物件
object=Example.new()
object.show

上述程式碼的VAR1 和 VAR2 是常量。

最後來看下Ruby中的偽變數,它可以看做是特殊的變數,有著區域性變數的外觀,但行為卻像常量,我們不能給它們賦值,來看下列表:

  • self: 當前方法的接收器物件。
  • true: 代表 true 的值。
  • false: 代表 false 的值。
  • nil: 代表 undefined 的值。
  • __FILE__: 當前原始檔的名稱。
  • __LINE__: 當前行在原始檔中的編號。

好啦,本次記錄就到這裡了。

如果感覺不錯的話,請多多點贊支援哦。。。