Ruby 的變量
本章節我們將講解 Ruby 中如何創建一個變量,變量都有哪幾種,在什么場景下會使用這些變量。
1. 什么是變量
變量來源于數學,是計算機語言中能儲存計算結果或能表示值抽象概念?!俜蕉x
在 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 中,常量是一種不應更改的值,通常在類或模塊使用。