本章會(huì)介紹Ruby操作時(shí)需要掌握的基礎(chǔ)知識(shí),主要有以下四部分內(nèi)容。
1.對(duì)象
2.類(lèi)
3.變量
4.常量
4.1 對(duì)象
在Ruby中,表現(xiàn)數(shù)據(jù)的基本單位為對(duì)象(object)。
對(duì)象的類(lèi)型非常多,我們這里只介紹常用的對(duì)象。
·數(shù)值對(duì)象
1、-10、3.1415等是表示數(shù)字的對(duì)象,另外還有表示矩陣、復(fù)數(shù)、素?cái)?shù)、公式的對(duì)象。
·字符串對(duì)象
“你好”、“hello”是表示文字的對(duì)象
·數(shù)組對(duì)象、散列對(duì)象
表示多個(gè)數(shù)據(jù)集合的對(duì)象
·正則表達(dá)式對(duì)象
表示匹配模式的對(duì)象
·時(shí)間對(duì)象
表示時(shí)間的對(duì)象
·文件對(duì)象
一般我們可以理解為表示文件本身的對(duì)象,但確切來(lái)說(shuō),它是對(duì)文件進(jìn)行讀寫(xiě)操作的對(duì)象。
·符號(hào)對(duì)象
表示用于識(shí)別方法等名稱的標(biāo)簽的對(duì)象。
除此之外,Ruby還有范圍對(duì)象、異常對(duì)象等。
4.2 類(lèi)
Ruby的類(lèi)(class)表示的就是對(duì)象的種類(lèi)。
對(duì)象擁有什么特性等,這些都是由類(lèi)來(lái)決定的。到目前為止,我們所介紹的對(duì)象與所屬類(lèi)的對(duì)應(yīng)關(guān)系如下:
對(duì)象 類(lèi)
數(shù)值 Numeric
字符串 String
數(shù)組 Array
散列 Hash
正則表達(dá)式 Regexp
文件 File
符號(hào) Symbol
注意:xx類(lèi)的對(duì)象,我們一般也會(huì)說(shuō)成“xx類(lèi)的實(shí)例(Instance)”。所有Ruby對(duì)象其實(shí)都是某個(gè)類(lèi)的實(shí)例,因此在Ruby中的對(duì)象和實(shí)例的意義幾乎是一樣的。
4.3 變量
變量就是對(duì)象的名片。
Ruby中有四種類(lèi)型的變量。
- 局部變量(local variable)
以英文字母或者_(dá)開(kāi)頭 - 全局變量 (global variable )
以$開(kāi)頭 - 實(shí)例變量 (instance variable)
以@開(kāi)頭 - 類(lèi)變量 (class variable)
以@@開(kāi)頭 - 偽變量 (pseudo variable)
是 Ruby 預(yù)先定義好的代表某特定值的特殊變量,因此即使我們?cè)?程序里給偽變量賦值,它的值也不會(huì)改變。Ruby 中,nil、true、false、self 等都是偽變量。它們表面上雖然看著像變量,但實(shí)際的行為又與變量有差 別,因此稱為偽變量。
下面我們來(lái)說(shuō)明局部變量和全局變量的不同。
代碼清單 4.1 scopetest.rb
$x = 0
x = 0
require "./sub"
p $x #=> 1
p x #=> 0
代碼清單 4.2 sub.rb
$x = 1 #對(duì)全局變量賦值
x = 1 #對(duì)局部變量賦值

程序首次給局部變量賦值對(duì)同時(shí),局部變量就會(huì)被初始化,如果引用了未初始化的局部變量,程序就會(huì)拋出異常。
2.5.3 :001 > x + 1
Traceback (most recent call last):
1: from (irb#1):1
NameError (undefined local variable or method `x' for main:Object)
4.4 常量
常量和變量一樣,是某個(gè)對(duì)象的“名片”。不過(guò)與變量不同的是,對(duì)已經(jīng)賦值的常量再進(jìn)行賦值時(shí),Ruby會(huì)作出警告。
2.5.3 :002 > RES = 1
=> 1
2.5.3 :003 > RES = 2
(irb#1):3: warning: already initialized constant RES
(irb#1):2: warning: previous definition of RES was here
=> 2
2.5.3 :004 > RES
=> 2
我們注意到,雖然會(huì)作出警告,但是還是賦值成功了。
常量以大寫(xiě)英文字母開(kāi)頭,例如,Ruby 的運(yùn)行版本(RUBY_VERSION)、運(yùn)行平臺(tái)(RUBY_PLATFORM)、命令行參數(shù)數(shù)組(ARGV)等,都是 Ruby 預(yù)定義的好 的常量。
4.5 保留字
表 4.2 中的單詞,在程序中作為名稱使用時(shí)會(huì)受到限制。這些受到限制的單詞,我們稱為保留字。在程序里,如果不小心使用了 end、next 等作為變量 名,Ruby 會(huì)提示我們語(yǔ)法錯(cuò)誤。

4.6 多重賦值
我們已經(jīng)介紹過(guò)“變量=值”這樣的變量賦值方法,Ruby 還提供了一個(gè)只用一個(gè)表達(dá)式就能給多個(gè)變量賦值的簡(jiǎn)便方法——多重賦值。很多情況下我們都會(huì)用 到多重賦值,在這里舉幾個(gè)比較典型的例子供大家參考。
4.6.1合并執(zhí)行多個(gè)賦值操作
a = 1
b = 2
c = 3
可以簡(jiǎn)化為下面只有一行:
a, b, c = 1, 2, 3
這樣就能輕松地將 1、2、3 分別賦值給變量 a、b、c。如果對(duì)一組不相關(guān)的變量進(jìn)行多重賦值,程序會(huì)變得難懂,因此建議對(duì)彼此相關(guān)變量進(jìn)行多重賦值。 即使= 左右兩邊列表的數(shù)量不相等,Ruby 也不會(huì)報(bào)錯(cuò)。左邊被賦值的變量的個(gè)數(shù)比較多時(shí),Ruby 會(huì)自動(dòng)將 nil 賦值給未分配值的變量。
a, b, c, d = 1, 2
p [a, b, c] #=> [1, 2, nil]
變量部分比較少時(shí),Ruby 會(huì)忽略掉該值,不會(huì)分配多余的值。
a, b, c = 1, 2, 3, 4
p [a, b, c] #=> [1, 2, 3]
變量前加上*,表示 Ruby 會(huì)將未分配的值封裝為數(shù)組賦值給該變量。
a, b, *c = 1, 2, 3, 4, 5
p [a, b, c] #=> [1, 2, [3, 4, 5]]
a, *b, c = 1, 2, 3, 4, 5
p [a, b, c] #-> [1, [2, 3, 4], 5]
4.6.2 置換變量的值
現(xiàn)在我們來(lái)考慮一下如何置換變量 a、b 的值。通常,我們需要一個(gè)臨時(shí)變量 tmp 暫時(shí)地保存變量的值。
a, b = 0, 1
tmp = a # 暫時(shí)保存變量a 的值
a = b # 將變量b 的值賦值給a
b = tmp # 將原本變量a 的值賦值給變量b
p [a, b] #=> [1, 0]
使用多重賦值,只需一行程序就搞定了。
a, b = 0, 1
a, b = b, a # 置換變量a、b 的值
p [a, b] #=> [1, 0]
4.6.3 獲取數(shù)組的元素
ary = [1, 2]
a, b = ary
p a #=> 1
p b #=> 2
4.6.4 獲取嵌套數(shù)組的元素
我們來(lái)看看數(shù)組 [1, [2, 3], 4],用之前介紹的方法,我們可以分別取出 1,[2, 3]、4 的值。 ary = [1, [2, 3], 4]
ary = [1, [2, 3], 4]
a, b, c = ary
p a #=> 1
p b #=> [2, 3]
p c #=> 4
像下面那樣把左邊的變量括起來(lái)后,就可以再進(jìn)一步將內(nèi)部數(shù)組的元素值取出來(lái)。
ary = [1, [2, 3], 4]
a, (b1, b2), c = ary # 對(duì)與數(shù)組結(jié)構(gòu)相對(duì)應(yīng)的變量賦值
p a #=> 1
p b1 #=> 2
p b2 #=> 3
p c #=> 4
只要等號(hào)左邊的變量的結(jié)構(gòu)與數(shù)組的結(jié)構(gòu)一致,即使再?gòu)?fù)雜的結(jié)構(gòu),多重賦值都可以輕松對(duì)應(yīng)。