在 Ruby 程式設計中,變數是儲存資料的核心機制。理解不同類型變數的特性、作用域與命名慣例,是撰寫清晰、可維護程式碼的基石。本文將系統性介紹 Ruby 的五大變數類型、擬變數、常數與基本字面值,並搭配實戰範例說明。
全域變數以 $ 開頭(如 $global_variable),在程式任何位置皆可存取。未初始化時預設為 nil,若使用 -w 選項執行會產生警告。雖然方便,但過度使用會導致程式狀態難以追蹤,降低模組化程度,實務上建議謹慎使用。
#!/usr/bin/ruby
$global_variable = 10
class Class1
def print_global
puts "Class1 中的全域變數: #$global_variable"
end
end
class Class2
def print_global
puts "Class2 中的全域變數: #$global_variable"
end
end
class1obj = Class1.new
class1obj.print_global
class2obj = Class2.new
class2obj.print_global
輸出結果:
Class1 中的全域變數: 10
Class2 中的全域變數: 10
提示:在 Ruby 中,於變數或常數前加上 # 可直接插入其值(字串插值)。
實例變數以 @ 開頭(如 @cust_id),屬於特定物件實例,各實例擁有獨立副本。未初始化時為 nil。常用於 initialize 方法中設定物件狀態。
#!/usr/bin/ruby
class Customer
def initialize(id, name, addr)
@cust_id = id
@cust_name = name
@cust_addr = addr
end
def display_details
puts "客戶編號: #@cust_id"
puts "客戶姓名: #@cust_name"
puts "客戶地址: #@cust_addr"
end
end
cust1 = Customer.new("1", "John", "Wisdom Apartments, Ludhiya")
cust2 = Customer.new("2", "Poul", "New Empire road, Khandala")
cust1.display_details
cust2.display_details
輸出結果:
客戶編號: 1
客戶姓名: John
客戶地址: Wisdom Apartments, Ludhiya
客戶編號: 2
客戶姓名: Poul
客戶地址: New Empire road, Khandala
類別變數以 @@ 開頭(如 @@no_of_customers),在類別及其子類之間共享。必須先初始化才能使用,否則會拋出錯誤。適合儲存類別層級的共享狀態(如計數器)。
#!/usr/bin/ruby
class Customer
@@no_of_customers = 0
def initialize(id, name, addr)
@cust_id = id
@cust_name = name
@cust_addr = addr
end
def total_no_of_customers
@@no_of_customers += 1
puts "客戶總數: #@@no_of_customers"
end
end
cust1 = Customer.new("1", "John", "Wisdom Apartments")
cust2 = Customer.new("2", "Poul", "New Empire road")
cust1.total_no_of_customers
cust2.total_no_of_customers
輸出結果:
客戶總數: 1
客戶總數: 2
區域變數以小寫字母或底線 _ 開頭,作用域僅限於定義處所在的類別、模組、方法或區塊(do...end 或 {...})。未初始化的區域變數若被引用,會被視為無參數方法呼叫。生命週期在編譯階段即確定。
常數以大寫字母開頭(如 VAR1),慣例全大寫。定義於類別/模組內者可在該作用域存取,外部需用 :: 存取。不可在方法內定義。重新賦值會產生警告但不會報錯。
#!/usr/bin/ruby
class Example
VAR1 = 100
VAR2 = 200
def show
puts "第一個常數值: #{VAR1}"
puts "第二個常數值: #{VAR2}"
end
end
object = Example.new
object.show
輸出結果:
第一個常數值: 100
第二個常數值: 200
擬變數外觀像常數,實為特殊區域變數,不可賦值:
self:當前方法的接收者物件true / false:布林值nil:未定義值__FILE__:目前原始檔名稱__LINE__:目前行號Ruby 整數分為 Fixnum(-230 ~ 230-1 或 -262 ~ 262-1)與 Bignum(超出範圍)。支援多種進制與底線分隔:
123 # 十進位
1_234 # 帕底線分隔
-500 # 負數
0377 # 八進位
0xff # 十六進位
0b1011 # 二進位
?a # 字元 'a' 的碼
?\n # 換行碼 (0x0a)
12345678901234567890 # Bignum
屬於 Float 類別,支援科學記號:
123.4
1.0e6
4E20
4e+20
雙引號字串支援插值與跳脫字元,單引號僅支援 \\ 和 \':
puts 'escape using "\\"'
puts 'That\'s right'
# 輸出:
# escape using "\"
# That's right
字串插值範例:
puts "一天秒數: #{24*60*60}"
# 輸出:一天秒數: 86400

有序、可異質的物件集合,索引從 0 開始:
ary = ["fred", 10, 3.14, "This is a string", "last element"]
ary.each { |i| puts i }
鍵值對集合,鍵可為任意物件:
hsh = { "red" => 0xf00, "green" => 0x0f0, "blue" => 0x00f }
hsh.each { |key, value| print key, " is ", value, "\n" }
表示連續區間,.. 包含端點,... 排除端點:
(1..5).each { |n| print n, ' ' }
# 輸出:10 11 12 13 14 15