Ruby 的變量
本章節(jié)我們將講解 Ruby 中如何創(chuàng)建一個(gè)變量,變量都有哪幾種,在什么場景下會使用這些變量。
1. 什么是變量
變量來源于數(shù)學(xué),是計(jì)算機(jī)語言中能儲存計(jì)算結(jié)果或能表示值抽象概念?!俜蕉x
在 Ruby 中變量用來保存程序要使用的任何數(shù)據(jù)。
讓我們創(chuàng)建一個(gè)變量。
2. Ruby中如何創(chuàng)建一個(gè)變量
在Ruby中我們使用"變量名稱 =
名稱的值"這種形式來為變量進(jìn)行賦值操作。
下面是一些創(chuàng)建不同類型變量的例子:
實(shí)例:
name = "小明"
@cars = ['Toyota', 'BMW','Benz']
@@color = 'red'
$global_variable = 10
我們可以通過class
方法查看這個(gè)變量是什么類型的變量(換種說法,查看這個(gè)變量所屬的類是什么)。
實(shí)例:
> count = 10
=> 10
> count.class
=> Integer
解釋:不同于 Java 和 C 等所謂的強(qiáng)變量和靜態(tài)變量類型,在聲明變量的時(shí)候必須定義變量類型,此類型的編程語言在定義變量之后不能更改變量的類型。
這個(gè)是 C 語言的例子:
int count = 10;
Ruby 是一種動(dòng)態(tài)的語言,創(chuàng)建變量無需定義變量類型,取而代之的是 Ruby 的解釋器查看分配給變量值的類型,并動(dòng)態(tài)計(jì)算出變量的類型。這樣做的優(yōu)點(diǎn)是,聲明了變量之后,我們可以在之后的代碼中動(dòng)態(tài)更改變量而無需去關(guān)心它的類型
下面我們來了解在 Ruby 中都有哪幾種變量:
3. Ruby中有哪幾種變量
在 Ruby 中,根據(jù)變量的作用范圍(作用域),變量被分為局部變量(local variables)、實(shí)例變量(instance variables)、類變量(class variables)、全局變量(global variables)4種。另外,Ruby還有一種常量類型(constant)。每種變量都通過在變量名的開頭使用特殊字符來聲明,如下表所示。
名稱開頭 | 作用范圍 |
---|---|
$ |
構(gòu)造函數(shù),創(chuàng)建新對象時(shí) |
@ |
析構(gòu)函數(shù),對象的銷毀時(shí) |
[a-z] or _ |
局部變量(作用域在定義的一個(gè)方法里) |
[A-Z] |
方法重載,靜態(tài)調(diào)用一個(gè)不可訪問方法時(shí) |
@@ |
類變量(作用域?yàn)橐粋€(gè)類) |
Ruby 有兩個(gè)不能分配值的偽變量,一個(gè)是 nil
,它被分配給未初始化的對象;另一個(gè)是 self
,它被用來指向正在操作的對象。
3.1 全局變量
Ruby 中的全局變量可以在 Ruby 程序中的任何位置訪問,無論它們在何處聲明。全局變量名稱以美元符號($
)為前綴。
實(shí)例:
$welcome = "Welcome to Ruby Essentials"
注意事項(xiàng):不要輕易使用全局變量,問題在于,它們不僅在程序代碼中的任何位置都可見,而且還可以在應(yīng)用程序中的任何位置進(jìn)行更改。這會使異常追蹤變得困難。
3.2 類變量
類變量是在類的所有實(shí)例之間共享的變量。這意味著從該類實(shí)例化的所有對象僅存在一個(gè)變量值。這意味著,如果一個(gè)對象實(shí)例更改了類變量的值,那么對于所有其他對象實(shí)例,該新值將實(shí)質(zhì)上發(fā)生更改。類變量通過在變量名前添加兩個(gè) @ 字符(@@
)來聲明,并且類變量必須在創(chuàng)建時(shí)初始化。
實(shí)例:
@@total = 0
3.3 實(shí)例變量
實(shí)例變量與類變量相似,不同之處在于它們的值在對象的特定實(shí)例中是局部的。例如,如果一個(gè)類包含一個(gè)稱為@total
的實(shí)例變量,則如果該對象的一個(gè)實(shí)例更改了@total
的當(dāng)前值,則該更改僅對進(jìn)行更改的對象是有效的,對于其他的對象是無效的。
這是一個(gè)創(chuàng)建包含實(shí)例變量的對象的例子(Ruby的類章節(jié)中會詳細(xì)講解類的創(chuàng)建):
# 這個(gè)是Song類,里面有一個(gè)setter方法,可以給@title實(shí)例變量賦值。
class Song
def title= name
@title = name
end
end
# 創(chuàng)建song1,和song2兩個(gè)對象
song1 = Song.new
song2 = Song.new
# song1的title為 Welcome my Ruby world
song1.title = "Welcome my Ruby world"
song2.title = "World is perfect"
# 打印兩個(gè)對象
p song1
p song2
# ---- 輸出結(jié)果 ----
#<Song:0x007faa5e894648 @title="Welcome my Ruby world">
#<Song:0x007faa5e894620 @title="World is perfect">
解釋:從打印結(jié)果我們可以看到,我們實(shí)例化 song1 和 song2 后傳入的title不同,他們的@title
發(fā)生了改變,但是彼此之間不會互相影響。
在 Ruby 中,實(shí)例變量是通過在變量名稱前添加一個(gè)@
符號來聲明的。
實(shí)例:
@total = 10
Tips:實(shí)例變量默認(rèn)值為 nil。
3.4 局部變量
它們的名稱始終以小寫字母(a-z)或下劃線(_)開頭。
實(shí)例:
loopcounter = 10
_LoopCounter = 20
注意事項(xiàng):
在Ruby中我們調(diào)用方法(詳情請查看:Ruby的方法)可以省略括號()
,這就會導(dǎo)致變量名和方法名可能重名的問題。
實(shí)例:
some_thing = 'I am a variable' # 現(xiàn)在我是一個(gè)變量
# 定義了一個(gè)some_thing的方法
def some_thing
puts 'I am a method'
end
puts some_thing
# ---- 輸出結(jié)果 ----
I am a variable
解釋:當(dāng)變量名和方法名稱一致的時(shí)候,優(yōu)先使用變量名。
如果我們也要調(diào)用方法的話,要在變量名后面增加一個(gè)括號()
。
實(shí)例:
puts some_thing()
# ---- 輸出結(jié)果 ----
I am a method
當(dāng)局部變量沒有定義時(shí)被調(diào)用會拋出異常。
puts undefined_variable
# ---- 輸出結(jié)果 ----
ruby.rb:1:in `<main>': undefined local variable or method `undefined_variable' for main:Object (NameError)
局部變量在聲明它們的代碼結(jié)構(gòu)中是局部的,例如,在方法或循環(huán)內(nèi)聲明的局部變量無法在該循環(huán)或方法外訪問。(在作用域章節(jié)中會詳細(xì)介紹)
loopcounter = 10
def a_method
puts loopcounter
end
a_method
# ---- 輸出結(jié)果 ----
ruby.rb:3:in `a_method': undefined local variable or method `loopcounter' for main:Object (NameError) from ruby.rb:5:in `<main>'
解釋:因?yàn)樵?code>a_method方法的作用域中沒有找到loopcounter
這個(gè)局部變量,所以拋出了異常。
3.5 常量
Ruby 常量是一旦分配了值就不應(yīng)更改的值。我之所以這樣說是因?yàn)?Ruby 與大多數(shù)編程語言的不同之處在于,它允許在聲明常量后更改常量值,Ruby 解釋器會在更改值后給出警告。常量的每個(gè)字母都應(yīng)該大寫,多個(gè)單詞使用下劃線(_
)分隔。
它可以在類或模塊內(nèi)聲明的常量可在該類或模塊的上下文中的任何位置使用。在類或模塊外部聲明的常量將分配給全局范圍。
實(shí)例:
TOTAL_COUNT = 10
4. 小結(jié)
本章節(jié)中我們了解了在 Ruby 中一共有 4 種變量:局部變量、實(shí)例變量、類變量、全局變量,他們的作用范圍分別方法、對象、類、全局。除此之外在 Ruby 中,常量是一種不應(yīng)更改的值,通常在類或模塊使用。