# **第 1 章 Ruby 初探**
那么,我們趕快來看一下 Ruby 能做些什么。
本章會介紹以下內容。
-
**使用 Ruby**
了解如何使用 Ruby 編寫并執行程序。
-
**使用字符和數值**
了解字符和數值是如何輸出、計算以及給變量賦值等內容。
-
**使用條件判斷和循環處理**
了解如何通過字符串或數值比較進行條件判斷處理,以及如何進行循環處理。
讀完本章,大家就能大概掌握用 Ruby 編寫程序的方法了。

### **1.1 Ruby 的運行方法**
首先,讓我們用 Ruby 編寫一個在屏幕上輸出字符的小程序。
Ruby 程序有多種執行方法,其中最常見的方法是使用 ruby 命令來執行,其次就是使用 irb 命令,以交互式命令行方式來執行。若只是想執行小程序,使用 irb 命令會相對簡單一點。
接下來,我們先介紹 ruby 命令以及 irb 命令的使用方法。
另外,讀者如果還沒安裝 Ruby,請參考附錄 A 預先安裝好 Ruby 運行環境。
> **注** 本書適用于 Ruby 2.0 或者 Ruby 1.9。由于 Mac OS X 和 Linux 系統默認安裝的 Ruby 版本比較舊,因此請讀者安裝新版本的 Ruby。
### **1.1.1 ruby 命令的執行方法**
首先,讓我們看看代碼清單 1.1 的程序。
**代碼清單 1.1 helloruby.rb**
~~~
print("Hello, Ruby.\n")
~~~
> **注** 日文 Windows 系統中的 \ 會顯示為¥。原則上,本書統一書寫為 \。
各位是否有些沮喪呢?一般聽到“程序”,我們可能會聯想到一長串密碼似的東西。但這個程序的代碼只有一行,總共才 20 來個字符。可這的確是一個真真切切的程序,執行后就可以達到我們預想的目的。
請大家打開編輯器,寫入上述程序,將文件名修改為 helloruby.rb,保存文件。.rb 是 Ruby 程序的后綴,表示這個文件內容是 Ruby 程序。
> **備注** 寫代碼時會用到編輯器或者 IDE,它們的相關內容請參考 A.5 節。
接下來讓我們啟動控制臺,執行程序。
> **備注** 關于控制臺的啟動方法,請參考附錄 A 里各操作系統的說明。
啟動控制臺后,使用 cd 命令,移動到存放 helloruby.rb 的文件夾中。例如,使用 Windows,文件放在 C 盤的 src 文件夾(`c:\src`),然后執行以下命令,
~~~
> cd c:\src
~~~
接著再執行,
~~~
> ruby helloruby.rb
~~~
執行后,如圖 1.1 所示,會顯示“`Hello, Ruby.`”。

**圖 1.1 執行 Ruby**
> **備注** 如果執行時出錯,請參考附錄 A 以及 B.5 節的內容。
### **1.1.2 irb 命令的執行方法**
接下來,我們介紹 irb 命令的執行方法。
與 ruby 命令一樣,irb 命令在控制臺執行,不過不需要指定程序文件。
執行 irb 命令后,就會出現以下這樣的命令提示符。1
1使用 Ruby Instarller for Windows 安裝包安裝的 Ruby,在執行 irb 命令的時候有可能會顯示“DL is deprecated, please use Fiddle”這樣的警告。這是由于 Ruby Instarller for Windows 安裝包附帶的 readline 庫引用了名為 DL 的舊版本的庫,但這個警告不會對使用有任何影響。——譯者注
> **執行示例**
~~~
> irb
irb(main):001:0>
~~~
在這里,只需把剛才代碼清單 1.1 的代碼原封不動地在控制臺寫一次,然后直接按下回車鍵,即可執行程序。
> **執行示例**
~~~
irb(main):001:0> print("Hello, Ruby.\n")
Hello, Ruby. ← print 方法輸入的結果
=> nil
irb(main):002:0>
~~~
> **備注** 第三行的 `nil` 是 `print` 方法的返回值。關于方法的返回值我們將在 7.3.1 節詳細說明。
像這樣,在控制臺寫的程序可以馬上在控制臺里執行,這對進行簡單的小測試非常方便。但是,這個方法并不適合大程序,這時我們應該考慮使用 ruby 命令。
> **注** 在使用 Mac OS X 時,irb 命令會有無法正確輸入日語的情況。這時可在 irb 命令后加上 --noreadline 選項,執行 irb --noreadline 命令。這樣一來,關閉 readline 功能后,就可以正常輸入日語了。但請注意,由于關閉了 readline 功能,在控制臺編輯已經輸入的字符、查看歷史輸入記錄等功能都將無法使用。
在控制臺輸入 `exit` 后,按回車鍵,或者同時按下 Ctrl + d,都可以終止 irb 命令。
### **1.2 程序解說**
接下來,讓我們詳細解說一下代碼清單 1.1 的程序,雖然代碼只有孤零零的一行。
### **1.2.1 對象**
首先,請留意 `"Hello, Ruby.\n"` 這部分。

這部分被稱為 String 對象或者字符串對象,也可以直接稱這部分為字符串。也就是說,這部分是一個代表字符串 Hello, Ruby. 的對象(圖 1.2)。

**圖 1.2 數據與對象**
字符串、數值、時間等各種數據,在 Ruby 中都是對象。
> **備注** 字符串末尾的 \n 是換行符。
### **1.2.2 方法**
這一次,讓我們留意一下 `print` 這部分。

`print` 是一個方法。所謂方法,就是對象的行為。數值的加法或乘法運算、字符串的合并、某時刻一小時后或者一天后的計算等操作,都是通過執行方法來實現。
`print` 方法的作用就是輸出 `()` 里的內容。因此,執行 helloruby.rb 后,在控制臺顯示了字符串對象——`Hello, Ruby.`。
我們把執行方法時必需的條件稱為參數。例如,我們在說明 `print` 方法時,會說“`print` 方法會把作為參數傳遞過來的字符串,輸出到控制臺中”。
我們更換一下 `print` 方法的參數,試一下把它換成其他字符串。
~~~
print("Hello, RUBY!\n")
~~~
這一次,我們希望輸出大寫字母的 `Hello, RUBY!`。是不是感覺會更加精神點呢?
### **1.3 字符串**
我們再詳細看看有關字符串的內容。
### **1.3.1 換行符與 \**
上文我們提到過字符 `\n` 是換行符。利用換行符,我們可以用普通的字符達到換行的效果,例如,為達到以下效果,
~~~
Hello,
Ruby
!
~~~
程序可以這么寫:

原本也可以像下面一樣這么寫:
~~~
print("Hello,
Ruby
!
")
~~~
輸出結果雖然與第一種寫法是一樣的,但是,這樣的寫法會降低程序的可讀性,因此并不是一個好的寫法。既然 Ruby 已經幫我們準備了換行符,我們就直接用第一種方法吧。
除了 `\n` 以外,當我們想在字符串里嵌入特殊符號時,也會用到 \。雙引號是表示字符串開始和結束的符號,假設我們希望字符串里包含雙引號,程序要寫成 `\"`。
~~~
print("Hello, \"Ruby\".\n")
~~~
的輸出結果為:
~~~
Hello, "Ruby".
~~~
像這樣,程序會對字符串里 \ 后的字符做特殊處理。2 因此,如果字符串里需要包含 \,程序要寫成 \\。例如,
2這個過程稱為轉義,\ 稱為轉義字符。——譯者注
~~~
print("Hello \\ Ruby!")
~~~
的輸出結果為:
~~~
Hello \ Ruby!
~~~
請注意,兩個 \ 的輸出結果是一個 \。
### **1.3.2 ' ' 與 " "**
創建字符串對象除了可以使用`" "`(雙引號)外,也可以使用`' '`(單引號)。我們試試把之前程序的雙引號換成單引號,看一下有什么樣的效果。
~~~
print('Hello, \nRuby\n!\n')
~~~
這次的輸出結果為:
~~~
Hello, \nRuby\n!\n
~~~
程序會原封不動地輸出單引號里的內容。
也就是說,在單引號里,像 `\n` 這樣的特殊字符不經過轉義,程序會原封不動地直接輸出。但也有例外,例如在字符串里想嵌入 \ 與單引號時,還是需要在之前加上 \。也就是像這樣,
~~~
print('Hello, \\ \'Ruby\'.')
~~~
的輸出結果為:
~~~
Hello, \ 'Ruby'.
~~~
### **1.4 方法的調用**
關于方法,我們再詳細說明一下。 Ruby 在調用方法時可以省略 ()。因此,代碼清單 1.1 的 `print` 方法可以這樣寫:
~~~
print "Hello, Ruby.\n"
~~~
另外,如果想連續輸出多個字符串,可以用逗號(`,`)分隔各字符串,程序會按順序輸出字符串。因此,如下寫法也是可以的:
~~~
print "Hello, ", "Ruby", ".", "\n"
~~~
雖然這種寫法可以方便地輸出多個字符串,但是如果遇到比較復雜的參數,使用 `()` 會更加便于理解。因此,建議在習慣 Ruby 的語法之前,不要使用省略 `()` 的寫法。在一些較為簡單的情況下,本書會使用省略 `()` 的寫法。
一般來說,Ruby 是以從上到下的順序執行方法的。例如,執行下面的程序會得到相同的結果,也就是 `Hello, Ruby.`。
~~~
print "Hello, "
print "Ruby"
print "."
print "\n"
~~~
### **1.5 puts 方法**
`puts` 方法與 `print` 方法稍有區別,`puts` 方法在輸出結果的末尾一定會輸出換行符。用 `puts` 方法時,代碼清單 1.1 的程序可改寫為這樣:
~~~
puts "Hello, Ruby."
~~~
不過,當參數為兩個字符串時,
~~~
puts "Hello, ", "Ruby!"
~~~
各字符串末尾都會加上換行符,因此會輸出下面的結果:
~~~
Hello,
Ruby!
~~~
某些情況下,使用 `print` 方法可能會順手些;而某些情況下,使用 `print` 方法并不方便。請大家按照實際情況選擇該使用哪個方法。
### **1.6 p 方法**
接下來,我們再介紹一個與輸出有關的方法。Ruby 提供了一個更簡單的輸出對象內容的方法——`p` 方法。
無論使用 `print` 方法還是 `puts` 方法,輸出數值 1 和字符串 `"1"` 時,結果都只是單純的 1。這樣一來,我們就無法判斷輸出的結果到底是屬于哪個對象。這種情況下,`p` 方法可以很好地解決這個問題。使用 `p` 方法時,數值結果和字符串結果會以不同的形式輸出。讓我們趕快來嘗試一下。
~~~
puts "100" #=> 100
puts 100 #=> 100
p "100" #=> "100"
p 100 #=> 100
~~~
> **備注** 本書在表示程序輸出內容時,會在方法的旁邊添加`#=>` 字符,其右側即為方法的輸出結果。在這個例子里,`puts "100"`、`puts 100`、`p 100` 的輸出結果為字符串 `100`,`p "100"` 的輸出結果為字符串 `"100"`。
像這樣,輸出結果為字符串時,輸出結果會被雙引號括起來,一目了然。另外,使用 `p` 方法時,換行符(`\n`)、制表符(`\t`)等特殊字符不會轉義,會像下面那樣直接輸出(代碼清單 1.2)。
**代碼清單 1.2 put_and_p.rb**
~~~
puts "Hello, \n\tRuby."
p "Hello, \n\tRuby."
~~~
> **執行示例**
~~~
> ruby puts_and_p.rb
Hello,
Ruby.
"Hello, \n\tRuby."
~~~
如果只是需要輸出程序執行的結果、信息等,可以選擇 `print` 方法;如果想確認程序的執行情況,則可選擇 `p` 方法。原則上,`p` 方法是提供給編程者使用的。
### **1.7 中文的輸出**
到目前為止,我們使用的字符串都只包含字母。
接下來,我們看看如何輸出中文字符。其實,輸出中文字符也不是多難的事,只要把雙引號內的字母換成中文字符即可。像下面這樣:
**代碼清單 1.3 kiritsubo.rb**
~~~
print "話說某個朝代,后宮妃嬪甚多,\n"
print "其中有一宮女,出身并不十分高貴,卻蒙圣恩寵愛。\n"
~~~
> **執行示例**
~~~
> ruby kiritsubo.rb
話說某個朝代,后宮妃嬪甚多,
其中有一宮女,出身并不十分高貴,卻蒙圣恩寵愛。
~~~
不過,編碼設定不當也會導致輸出錯誤、亂碼等情況。遇到這樣的情況時,請參考專欄“中文使用注意事項”。
> **專欄**
> **中文使用注意事項**
> 在某些 Ruby 運行環境里,執行包含中文的腳本時,有可能出現以下錯誤。
> > **執行示例**
~~~
> ruby kiritsubo.rb
kiritsubo.rb:1: invalid multibyte char (US-ASCII)
kiritsubo.rb:1: invalid multibyte char (US-ASCII)
~~~
> 這是由于編寫程序時沒有指定程序的編碼方式造成的。Ruby 程序的編碼方式,是通過在程序的首行代碼添加注釋“`# encoding: 編碼方式`”來指定的(編碼的規則稱為 encoding)。我們稱這個注釋為魔法注釋(magic comment)。
> 例如,使用簡體中文版 Windows 常用編碼 GBK 編寫代碼時,可像下面這樣寫魔法注釋:
~~~
# encoding: GBK
print "話說某個朝代,后宮妃嬪甚多,\n "
print "其中有一宮女,出身并不十分高貴,卻蒙圣恩寵愛。\n "
~~~
> 這樣指定程序的編碼方式后,Ruby 在執行程序時就可以正確識別程序中的中文。下表是各平臺常用的編碼方式。平臺有多個常用編碼方式時,請按照實際情況選擇適合的編碼方式。
<table border="1" data-line-num="322 323 324 325 326 327" width="90%"><thead><tr><th> <p class="表頭單元格">平臺</p> </th> <th> <p class="表頭單元格">編碼方式</p> </th> </tr></thead><tbody><tr><td> <p class="表格單元格">Windows</p> </td> <td> <p class="表格單元格">GBK(或者GB 2312)</p> </td> </tr><tr><td> <p class="表格單元格">Mac OS X</p> </td> <td> <p class="表格單元格">UTF-8</p> </td> </tr><tr><td> <p class="表格單元格">Unix</p> </td> <td> <p class="表格單元格">UTF-8</p> </td> </tr></tbody></table>
> 另外,從 Ruby 2.0 開始,若沒指定魔法注釋,Ruby 會默認使用 UTF-8 編碼方式。因此,在 Ruby 2.0 中如果希望代碼采用 UTF-8 的編碼方式時,可省略魔法注釋 。
> 除此以外,使用上述 p 方法輸出中文時,有時也會出現亂碼的情況。這時,可使用“`-E 編碼方式`”這個選項來指定輸出結果的編碼方式。例如,希望以 UTF-8 編碼方式在控制臺輸出結果,可像下面這樣執行命令:
> > **執行示例**
~~~
> ruby -E UTF-8 腳本文件名 ← 腳本執行
> irb -E UTF-8 ← irb 啟動
~~~
### **1.8 數值表示與計算**
講解了字符串之后,讓我們再來看看 Ruby 是怎么處理數值的。在 Ruby 程序里,整數和小數(浮點數)的處理方式都很自然。
### **1.8.1 數值**
首先,讓我們先了解一下 Ruby 是如何表示數值的。1.2 節提到,Ruby 中的字符串是以字符串對象的形式存在的。同樣地,數值也是以“數值對象”的形式存在的。也就是說,在程序里操作的都是數值對象。
Ruby 的整數的表示方法很簡單。直接輸入數字就可以了,例如,
~~~
1
~~~
表示 1 的整數(`Fixnum`)對象。同樣地,
~~~
100
~~~
表示 100 的整數對象。
再如,
~~~
3.1415
~~~
這表示的是 3.1415 的浮點數(`Float`)對象。
> **備注** `Fixnum` 和 `Float` 是對象所屬類(class)的名稱。類的詳細內容我們將會在第 4 章和第 8 章說明。
數值的輸出與字符串輸出一樣,也是用 `print` 方法和 `puts` 方法。
~~~
puts(10)
~~~
執行以上代碼后,
> **執行示例**
~~~
10
~~~
會輸出到屏幕中。
### **1.8.2 四則運算**
Ruby 還可以對數值進行運算,并輸出其結果。我們來看看 Ruby 是怎么進行四則運算的。首先,我們用一下 irb 命令。
> **執行示例**
~~~
> irb --simple-prompt
>> 1 + 1
=> 2 ← 1 + 1 的執行結果
>> 2 - 3
=> -1 ← 2 - 3 的執行結果
>> 5 * 10
=> 50 ← 5 * 10 的執行結果
>> 100 / 4
=> 25 ← 100 / 4 的執行結果
~~~
> **備注** irb 命令后的選項 --simple-prompt 會簡化 irb 的輸出結果。
在一般的編程語言里,乘法運算符用 *,除法運算符用 /。Ruby 也延續了這個習慣。
讓我們再試一下復雜點的四則運算。四則運算的基本原則是“先乘除后加減”,Ruby 也遵循這個原則。也就是說,
~~~
20 + 8 / 2
~~~
的結果是 24。如果 20 + 8 后再想除 2,可以使用括號,
~~~
(20 + 8) / 2
~~~
這時答案為 14。
### **1.8.3 數學相關的函數**
除四則運算外,Ruby 中還可以使用數學函數,如平方根、sin 和 cos 等三角函數、指數函數等。使用數學函數時,必須在函數前加上 `Math.` 標識。
> **備注** 不想在函數前加 `Math.` 時,則需要 `include Math` 這段代碼。關于這些用法,我們會在 8.6.1 節進行說明。
求正弦時使用 `sin` 方法,求平方根時使用 `sqrt` 方法。執行相對應的函數方法,即可得到該函數的計算結果。一般我們稱這一過程為“執行方法后得到結果”,所得到的結果則稱為返回值。
> **執行示例**
~~~
> irb --simple-prompt
>> Math.sin(3.1415)
=> 9.26535896604902e-05 ← sin 方法的返回值
>> Math.sqrt(10000)
=> 100.0 ← sqrt 方法的返回值
~~~
> **注** 不同的 Ruby 版本,或者在不同平臺下執行時,返回值的位數可能會不同。
第一個返回值的結果是 9.26535896604902e-05,這是一種用來表示極大數或極小數的方法。“`(小數)e(整數)`”表示“`(小數) *10 的(整數)次冪`”。這個例子中,其結果值為“9.26535896604902 * 10 的-5 次冪”,也就是 0.0000926535896604902。
### **1.9 變量**
變量是程序里不可缺少的元素之一。可以將其理解為給對象貼上的標簽。
我們可以像下面這樣給對象貼上標簽(圖 1.3):
**變量名 = 對象**
我們稱這個過程為“將對象賦值給變量”。

**圖 1.3 變量和對象**
~~~
alphabet = "abcdefg"
num = 10
age = 18
name = 'TAKAHASHI'
~~~
為了說明如何使用變量,讓我們看看以下這個求長方體表面積和體積的例子(代碼清單 1.4)。
**代碼清單 1.4 area_volume.rb**
~~~
x = 10
y = 20
z = 30
area = (x*y + y*z + z*x) * 2
volume = x * y * z
print "表面積=", area, "\n"
print "體積=", volume, "\n"
~~~
若不使用變量,則程序會像下面這樣:
~~~
print "表面積=", (10*20 + 20*30 + 30*10) * 2, "\n"
print "體積=", 10*20*30, "\n"
~~~
這樣一來,一旦要修改一個值,那么好幾個地方也必須一起修改。上例只有兩行代碼,修改起來并不太麻煩,但遇到比較復雜的程序時,修改起來就會非常費勁。
另外,變量還可以清晰地表示某個值所代表的含義。因此,為變量起一個容易理解的名稱是非常重要的。例如,
~~~
hoge = (foo*bar + bar*baz + baz*foo) * 2
funi = foo * bar * baz
~~~
像這樣的代碼,使人完全搞不清楚這個程序的目的。所以,建議大家平時多加注意,最好使用 `area`、`volume` 等意義明確的單詞作為變量名。
### **print方法和變量**
讓我們再回顧一下print 方法。
~~~
print "表面積 =", area, "\n"
~~~
這個 `print` 方法有三個參數:`"表面積 = "`、`area`、`"\n"`。`print` 方法會按照順序,輸出這三個參數。
`"表面積 ="` 表示值為“`表面積 =`”的字符串,因此 `print` 方法會直接輸出。`area` 表示 `area` 這個變量引用的對象,在這個例子里就是 `2200` 這個整數,因此 `print` 方法輸出的是該整數值。
最后那個 `"\n"` 是換行符,因此 `print` 方法也會直接輸出。
這三個值經過 `print` 方法處理后,會在屏幕輸出“`表面積 = 2200`”加換行的結果。
傳遞給 `print` 方法的字符串參數也可以像下面這樣寫:
~~~
print "表面積 = #{area}\n"
~~~
`"表面積 = #{area}\n"` 為一個整體的字符串。`#{area}` 這樣的寫法,表示把 `area` 的值嵌入到字符串中。在字符串里使用 `#{...}` 這樣的寫法,可以把通過計算后得到的值嵌入到字符串中。輸出結果里除了可以嵌入變量名,也可以嵌入 `"表面積 = #{(x*y + y*z + z*x) * 2}\n"` 這樣的計算公式,得到的輸出結果是一樣的。
一般向屏幕輸出結果時,我們都希望同時輸出換行符,因此使用 `puts` 方法時,連 `\n` 也都不需要了,這樣程序會變得更加簡潔。
~~~
puts "表面積 = #{area}"
~~~
### **1.10 注釋**
我們在程序里可以寫注釋。注釋雖然寫在程序里面,但程序并不會執行注釋的內容,也就是說,注釋的內容對程序的執行結果不會產生任何影響。
大家也許會問:“為什么會在程序里寫這種與程序運行無關的東西呢?”的確,對于只執行一次就可以的簡單程序,并不需要特別的注釋。但是,一般來說,我們都會多次使用寫好的程序。那么,若希望記錄
-
**程序的名稱、作者、發布條件等信息**
-
**程序說明**
等內容時,就需要用到注釋。
Ruby 用`#`表示注釋的開始 3。某行是以 `#` 開頭時,則整行都是注釋。某行中間出現`#` 時,則`#`以后部分就都是注釋。另外,行的開頭用 `=begin` 和 `=end` 括起來的部分也是注釋 4。這樣的注釋方法,在程序開頭或結尾寫長說明時會經常用到。
3單行注釋。——譯者注
4多行注釋。——譯者注
**代碼清單 1.5 comment_sample.rb**
~~~
=begin
《Ruby 基礎教程(第 4 版)》示例
注釋的使用示例
2006/06/16 創建
2006/07/01 追加一部分注釋
2013/04/01 第 4 版更新
=end
x = 10 # 寬
y = 20 # 長
z = 30 # 高
# 計算表面積和體積
area = (x*y + y*z + z*x) * 2
volume = x * y * z
# 輸出
print "表面積=", area, "\n"
print "體積=", volume, "\n"
~~~
除此以外,注釋還有使某行代碼“暫時不執行”的作用。
Ruby 沒有 C 中使行的某部分成為注釋的寫法,只要是以`#` 開始的部分,到行末為止一定都是注釋。
### **1.11 控制語句**
編程語言中都有控制語句。
控制語句能讓程序在某種條件下,改變執行順序,或者只執行某一部分。
### **控制語句的分類**
控制語句大致可以分成以下幾類。
-
**順序控制**:按照程序的編寫順序,從頭到尾執行。
-
**條件控制**:若某條件成立,則執行○○,否則執行 ××。
-
**循環控制**:在某條件成立之前,反復執行○○。
-
**異常控制**:發生某種異常時,執行○○。
順序控制是程序最常見的處理方式。若不做特殊處理,程序會按照代碼的編寫順序執行。
條件控制,是指根據條件執行分支處理。如果沒有滿足條件,程序會跳過某部分處理,繼續執行其他處理。在 Ruby 中,可使用的條件判斷語句有 `if`、`unless`、`case` 等。
循環控制,是指根據條件反復執行某個處理。在這種情況下,該處理的執行順序會與程序編寫的順序不同,執行過一次的程序,會從頭再執行一次。
異常控制有點特殊。程序執行時,意料之外的錯誤發生后,就會跳出正在執行的那部分程序,然后執行其他地方的程序,使程序能繼續執行下去。根據實際情況,有時也會讓程序馬上結束。
接下來,我們進一步介紹條件控制和循環控制。
### **1.12 條件判斷:if~then~end**
`if` 語句用于根據條件變化,改變程序的行為。`if` 語句的語法如下所示:
**`if` 條件 `then`
條件成立時執行的處理
`end`**
條件一般是指能返回 `true` 或者 `false` 的表達式。例如比較兩個值,相同則返回 `true`,不同則返回 `flase`,這樣的表達式可作為條件。
我們在比較數值的大小時,會用到等號、不等號等運算符。在 Ruby 中,`=` 已經被用作賦值運算了,因此判斷是否相等的運算符要用兩個并列等號`==` 來代替`=`。另外,`≤`和`≥`運算符在 Ruby 中分別用 `<=` 和 `>=` 來替代。
條件表達返回的結果為 `true` 或者 `false`,`true` 表示條件成立,`false` 表示條件不成立。
~~~
p (2 == 2) #=> true
p (1 == 2) #=> false
p (3 > 1) #=> true
p (3 > 3) #=> false
p (3 >= 3) #=> true
p (3 < 1) #=> false
p (3 < 3) #=> false
p (3 <= 3) #=> true
~~~
我們也可以使用`==`運算符比較字符串。字符串內容相同則返回 `true`,內容不同則返回 `false`。
~~~
p ("Ruby" == "Ruby") #=> true
p ("Ruby" == "Rubens") #=> false
~~~
判斷值不相等時要使用`!=` 運算符,它與≠意思相同。
~~~
p ("Ruby != "Rubens") #=> true
p (1 != 1) #=> false
~~~
那么,接下來讓我們來看一下如何使用這些運算符編寫條件語句。代碼清單 1.6 是一個簡單的程序:變量 a 大于等于 10 時輸出 `bigger`,小于 9 時輸出 `smaller`。
**代碼清單 1.6 bigger_smaller.rb**
~~~
a = 20
if a >= 10 then
print "bigger\n"
end
if a <= 9 then
print "smaller\n"
end
~~~
在這里可以省略 `then` 關鍵字。
~~~
if a >= 10
print "bigger\n"
end
┊
~~~
如果希望對條件成立和條件不成立時采取不同的處理,我們可以使用 `else` 關鍵字。
**`if` 條件 `then`
條件成立時執行的處理
`else`
條件不成立時執行的處理
`end`**
使用 `else` 關鍵字改寫剛才的程序后,會變成下面這樣,
~~~
if a >= 10
print "bigger\n"
else
print "smaller\n"
end
~~~
### **1.13 循環**
有時,我們會遇到希望多次循環執行同樣的處理的情況。下面,我們來介紹兩種執行循環處理的方法。
### **1.13.1 while 語句**
`while` 語句是執行循序時用到的一種基本語句。同樣地,`do` 關鍵字可以省略。
**`while` 循環條件 `do`
希望循環的處理
`end`**
-
**例:按順序輸出從 1 到 10 十個數字**
~~~
i = 1
while i <= 10
print i, "\n"
i = i + 1
end
~~~
### **1.13.2 times 方法**
循環處理的循環次數如果已確定,使用 `times` 方法會更加簡單。
**循環次數 .`times do`
希望循環的處理
`end`**
-
**輸出 100 行“All work and no play makes Jack a dull boy.”**
~~~
100.times do
print "All work and no play makes Jack a dull boy.\n"
end
~~~
`times` 方法被稱為迭代器(iterator)。迭代器是 Ruby 的一個特色功能。從迭代器的英語拼寫方法我們可以知道,迭代器表示的是循環(iterate)的容器(-or)。類似地,運算符(operator)也就是運算(operate)的容器(-or),等等。總之,迭代器就是指用于執行循環處理的方法。
Ruby 除了 `times` 方法外,還提供了很多迭代器,典型的有 `each` 方法。`each` 方法的相關內容,我們會在第 2 章中與數組、散列一起介紹。
- 推薦序
- 譯者序
- 前言
- 本書的讀者對象
- 第 1 部分 Ruby 初體驗
- 第 1 章 Ruby 初探
- 第 2 章 便利的對象
- 第 3 章 創建命令
- 第 2 部分 Ruby 的基礎
- 第 4 章 對象、變量和常量
- 第 5 章 條件判斷
- 第 6 章 循環
- 第 7 章 方法
- 第 8 章 類和模塊
- 第 9 章 運算符
- 第 10 章 錯誤處理與異常
- 第 11 章 塊
- 第 3 部分 Ruby 的類
- 第 12 章 數值類
- 第 13 章 數組類
- 第 14 章 字符串類
- 第 15 章 散列類
- 第 16 章 正則表達式類
- 第 17 章 IO 類
- 第 18 章 File 類與 Dir 類
- 第 19 章 Encoding 類
- 第 20 章 Time 類與 Date 類
- 第 21 章 Proc 類
- 第 4 部分 動手制作工具
- 第 22 章 文本處理
- 第 23 章 檢索郵政編碼
- 附錄
- 附錄 A Ruby 運行環境的構建
- 附錄 B Ruby 參考集
- 后記
- 謝辭