先理解 Ruby 的思考方式
- 所有東西幾乎都能當成物件來操作
- 程式碼追求「讀起來像自然語言」
- IRB 很適合邊試邊學
- 最後一個運算結果常常就是回傳值
本教學網站包含 Ruby 基本語法、條件判斷、迴圈、方法、陣列、雜湊、物件導向、實務範例與互動小測驗。 適合第一次接觸 Ruby 的初學者,也適合作為快速複習用的單頁筆記。
irb(main):001:0> puts "Hello, Ruby!"
Hello, Ruby!
=> nil
irb(main):002:0> name = "Matz"
=> "Matz"
irb(main):003:0> puts "Ruby 的創始人是 #{name}"
Ruby 的創始人是 Matz
=> nil
irb(main):004:0> [1, 2, 3].map { |n| n * 2 }
=> [2, 4, 6]
建議初學者先從 IRB(Interactive Ruby)互動環境開始,因為可以立即看到每行程式的執行結果。
Ruby 是一門重視可讀性與開發體驗的語言,核心內容分為 literals、assignment、control expressions、methods、calling methods、modules and classes、exceptions、operators 等主題。
Quickstart: 若已安裝 Ruby,可先開啟 IRB 練習字串輸出、基本運算與變數指定,這是最直覺的入門方式。
ruby -v irb
irb 進入互動模式。
puts "Hello, Ruby!"
puts 會把內容印到畫面上。示範了 puts "Hello World" 的寫法。
以下依照初學者最需要的主題整理:資料型別、字串、陣列、雜湊、條件判斷、迴圈、方法與物件導向。
Ruby 常見的基本資料包含數字、字串、布林值與 nil。在 Ruby 的條件判斷裡,只有 nil 和 false 會被視為假,其餘物件都是真值。這是 Ruby 非常重要的觀念。
name = "Ruby" age = 30 is_fun = true nothing = nil puts name puts age puts is_fun puts nothing.inspect
0、空字串 ""、空陣列 [] 在 Ruby 裡都算真值,不是 false。
Ruby 很常使用雙引號字串搭配 #{變數} 進行字串插值,讓輸出更自然、可讀性更高。
name = "小明"
score = 95
puts "學生姓名:#{name}"
puts "考試成績:#{score} 分"
小技巧:雙引號會處理字串插值,單引號通常不會。
根據 Ruby 核心文件,Array 可用正索引、負索引、範圍切片或起點加長度的方式存取資料,也能用 map、select、each 等方法處理集合。
fruits = ["apple", "banana", "cherry"]
puts fruits[0] # apple
puts fruits[-1] # cherry
p fruits[0..1] # ["apple", "banana"]
fruits.each do |fruit|
puts "我喜歡 #{fruit}"
end
| 寫法 | 用途 |
|---|---|
arr[0] |
取得第一個元素 |
arr[-1] |
取得最後一個元素 |
arr[1, 2] |
從索引 1 開始取 2 個元素 |
arr[0..2] |
用範圍切片 |
Hash 是 Ruby 中用來儲存鍵值對的資料結構。Hash 的 key 必須唯一,而且 Hash 會保留項目建立時的順序。
person = {
name: "Matz",
language: "Ruby",
age: 59
}
puts person[:name]
puts person[:language]
puts person[:age]
name: "值",這其實是 symbol key 的簡潔語法。
Ruby 控制流程包含多種控制表達式,包含 if、unless、case、while、until、for、break、next、redo 等。
score = 82 if score >= 90 puts "優秀" elsif score >= 60 puts "及格" else puts "不及格" end logged_in = false unless logged_in puts "請先登入" end grade = "B" case grade when "A" puts "表現非常好" when "B" puts "表現不錯" else puts "再加油" end
Ruby 有傳統迴圈,也很常使用集合搭配區塊進行迭代。實務上,each 比 for 更常見,因為更符合 Ruby 的風格。
i = 1
while i <= 3
puts "while 次數:#{i}"
i += 1
end
count = 3
until count == 0
puts "倒數:#{count}"
count -= 1
end
[10, 20, 30].each do |num|
puts num * 2
end
while 當成「條件成立就繼續跑」,把 until 當成「條件成立前一直跑」。
Ruby方法定義通常由 def 開始,以 end 結束;方法預設回傳最後一個運算結果。預設參數、關鍵字參數、splat 參數與 block 參數等語法。
def greet(name, title = "同學")
"你好,#{title} #{name}"
end
puts greet("小華")
puts greet("小華", "老師")
def introduce(name:, age:)
"我是 #{name},今年 #{age} 歲"
end
puts introduce(name: "Ruby", age: 30)
def sum_all(*numbers)
numbers.sum
end
puts sum_all(1, 2, 3, 4)
| 語法 | 說明 |
|---|---|
def hello ... end |
基本方法定義 |
a = 1 |
預設參數 |
name: |
關鍵字參數 |
*args |
收集多個位置參數 |
&block |
接收區塊參數 |
Ruby 非常常使用區塊。你可以把區塊想成「一小段傳進方法裡執行的程式」。這種寫法在陣列處理、檔案讀寫與 DSL 設計中特別常見。
numbers = [1, 2, 3, 4, 5]
squares = numbers.map { |n| n ** 2 }
evens = numbers.select { |n| n.even? }
p squares
p evens
map 是轉換資料,select 是篩選資料。這兩個方法非常值得熟悉。
Ruby 很適合用簡潔的語法建立物件、封裝資料與行為。
class Dog
attr_accessor :name
def initialize(name)
@name = name
end
def bark
"#{@name}:汪!"
end
end
dog = Dog.new("小白")
puts dog.bark
@name 是實例變數,initialize 是建立物件時自動執行的初始化方法。
光懂語法還不夠,真正熟悉 Ruby 的關鍵是把語法拿去組成小功能。下面提供三個很適合初學者練習的例子。
結合輸入、條件判斷與字串插值。
print "請輸入分數:"
score = gets.to_i
result =
if score >= 90
"A"
elsif score >= 80
"B"
elsif score >= 70
"C"
elsif score >= 60
"D"
else
"F"
end
puts "你的等第是:#{result}"
gets.to_i 讀取數字
使用 Array 儲存多筆資料,再用 each_with_index 顯示清單。
todos = []
loop do
puts "\n1. 新增待辦"
puts "2. 查看清單"
puts "3. 離開"
print "請選擇:"
choice = gets.to_i
case choice
when 1
print "輸入待辦內容:"
item = gets.chomp
todos << item
puts "已新增:#{item}"
when 2
puts "\n=== 待辦清單 ==="
todos.each_with_index do |todo, index|
puts "#{index + 1}. #{todo}"
end
when 3
puts "再見!"
break
else
puts "請輸入有效選項"
end
end
loop do 與 break<<case 分支使用 class 管理資料與功能,是很典型的 Ruby 物件導向入門案例。
class BankAccount
attr_reader :owner, :balance
def initialize(owner, balance = 0)
@owner = owner
@balance = balance
end
def deposit(amount)
@balance += amount
"#{owner} 存入 #{amount} 元,目前餘額 #{@balance} 元"
end
def withdraw(amount)
if amount > @balance
"餘額不足"
else
@balance -= amount
"#{owner} 提領 #{amount} 元,目前餘額 #{@balance} 元"
end
end
end
account = BankAccount.new("小林", 1000)
puts account.deposit(500)
puts account.withdraw(300)
puts account.withdraw(5000)
attr_reader 提供唯讀屬性做完下面 6 題,快速檢查你對 Ruby 核心語法的理解。