10 Ruby 的變數
本章節我們將講解 Ruby 中如何建立一個變數,變數都有哪幾種,在什麼場景下會使用這些變數。
1. 什麼是變數
變數來源於數學,是計算機語言中能儲存計算結果或能表示值抽象概念。——官方定義
在 Ruby 中變數用來儲存程式要使用的任何資料。
讓我們建立一個變數。
2. Ruby中如何建立一個變數
在Ruby中我們使用"變數名稱 =
名稱的值"這種形式來為變數進行賦值操作。
下面是一些建立不同型別變數的例子:
例項:
name = "小明"
@cars = ['Toyota', 'BMW','Benz']
@@color = 'red'
$global_variable = 10
我們可以通過class
例項:
> count = 10
=> 10
> count.class
=> Integer
解釋:不同於 Java 和 C 等所謂的強變數和靜態變數型別,在宣告變數的時候必須定義變數型別,此型別的程式語言在定義變數之後不能更改變數的型別。
這個是 C 語言的例子:
int count = 10;
Ruby 是一種動態的語言,建立變數無需定義變數型別,取而代之的是 Ruby 的直譯器檢視分配給變數值的型別,並動態計算出變數的型別。這樣做的優點是,聲明瞭變數之後,我們可以在之後的程式碼中動態更改變數而無需去關心它的型別
下面我們來了解在 Ruby 中都有哪幾種變數:
3. Ruby中有哪幾種變數
在 Ruby 中,根據變數的作用範圍(作用域),變數被分為區域性變數(local variables)、例項變數(instance variables)、類變數(class variables)、全域性變數(global variables)4種。另外,Ruby還有一種常量型別(constant)。每種變數都通過在變數名的開頭使用特殊字元來宣告,如下表所示。
名稱開頭 | 作用範圍 |
---|---|
$ |
建構函式,建立新物件時 |
@ |
解構函式,物件的銷燬時 |
[a-z] or _ |
區域性變數(作用域在定義的一個方法裡) |
[A-Z] |
方法過載,靜態呼叫一個不可訪問方法時 |
@@ |
類變數(作用域為一個類) |
Ruby 有兩個不能分配值的偽變數,一個是 nil
,它被分配給未初始化的物件;另一個是 self
,它被用來指向正在操作的物件。
3.1 全域性變數
Ruby 中的全域性變數可以在 Ruby 程式中的任何位置訪問,無論它們在何處宣告。全域性變數名稱以美元符號($
)為字首。
例項:
$welcome = "Welcome to Ruby Essentials"
注意事項:不要輕易使用全域性變數,問題在於,它們不僅在程式程式碼中的任何位置都可見,而且還可以在應用程式中的任何位置進行更改。這會使異常追蹤變得困難。
3.2 類變數
類變數是在類的所有例項之間共享的變數。這意味著從該類例項化的所有物件僅存在一個變數值。這意味著,如果一個物件例項更改了類變數的值,那麼對於所有其他物件例項,該新值將實質上發生更改。類變數通過在變數名前新增兩個 @ 字元(@@
)來宣告,並且類變數必須在建立時初始化。
例項:
@@total = 0
3.3 例項變數
例項變數與類變數相似,不同之處在於它們的值在物件的特定例項中是區域性的。例如,如果一個類包含一個稱為@total
的例項變數,則如果該物件的一個例項更改了@total
的當前值,則該更改僅對進行更改的物件是有效的,對於其他的物件是無效的。
這是一個建立包含例項變數的物件的例子(Ruby的類章節中會詳細講解類的建立):
# 這個是Song類,裡面有一個setter方法,可以給@title例項變數賦值。
class Song
def title= name
@title = name
end
end
# 建立song1,和song2兩個物件
song1 = Song.new
song2 = Song.new
# song1的title為 Welcome my Ruby world
song1.title = "Welcome my Ruby world"
song2.title = "World is perfect"
# 列印兩個物件
p song1
p song2
# ---- 輸出結果 ----
#<Song:0x007faa5e894648 @title="Welcome my Ruby world">
#<Song:0x007faa5e894620 @title="World is perfect">
解釋:從列印結果我們可以看到,我們例項化 song1 和 song2 後傳入的title不同,他們的@title
發生了改變,但是彼此之間不會互相影響。
在 Ruby 中,例項變數是通過在變數名稱前新增一個@
符號來宣告的。
例項:
@total = 10
Tips:例項變數預設值為 nil。
3.4 區域性變數
它們的名稱始終以小寫字母(a-z)或下劃線(_)開頭。
例項:
loopcounter = 10
_LoopCounter = 20
注意事項:
在Ruby中我們呼叫方法(詳情請檢視:Ruby的方法)可以省略括號()
,這就會導致變數名和方法名可能重名的問題。
例項:
some_thing = 'I am a variable' # 現在我是一個變數
# 定義了一個some_thing的方法
def some_thing
puts 'I am a method'
end
puts some_thing
# ---- 輸出結果 ----
I am a variable
解釋:當變數名和方法名稱一致的時候,優先使用變數名。
如果我們也要呼叫方法的話,要在變數名後面增加一個括號()
。
例項:
puts some_thing()
# ---- 輸出結果 ----
I am a method
當局部變數沒有定義時被呼叫會丟擲異常。
puts undefined_variable
# ---- 輸出結果 ----
ruby.rb:1:in `<main>': undefined local variable or method `undefined_variable' for main:Object (NameError)
區域性變數在宣告它們的程式碼結構中是區域性的,例如,在方法或迴圈內宣告的區域性變數無法在該迴圈或方法外訪問。(在作用域章節中會詳細介紹)
loopcounter = 10
def a_method
puts loopcounter
end
a_method
# ---- 輸出結果 ----
ruby.rb:3:in `a_method': undefined local variable or method `loopcounter' for main:Object (NameError) from ruby.rb:5:in `<main>'
解釋:因為在a_method
方法的作用域中沒有找到loopcounter
這個區域性變數,所以丟擲了異常。
3.5 常量
Ruby 常量是一旦分配了值就不應更改的值。我之所以這樣說是因為 Ruby 與大多數程式語言的不同之處在於,它允許在宣告常量後更改常量值,Ruby 直譯器會在更改值後給出警告。常量的每個字母都應該大寫,多個單詞使用下劃線(_
)分隔。
它可以在類或模組內宣告的常量可在該類或模組的上下文中的任何位置使用。在類或模組外部宣告的常量將分配給全域性範圍。
例項:
TOTAL_COUNT = 10
4. 小結
本章節中我們瞭解了在 Ruby 中一共有 4 種變數:區域性變數、例項變數、類變數、全域性變數,他們的作用範圍分別方法、物件、類、全域性。除此之外在 Ruby 中,常量是一種不應更改的值,通常在類或模組使用。