首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 更多程式設計知識

深入解析 Ruby 變數類型與作用域

     編輯:更多程式設計知識

在 Ruby 程式設計中,變數是儲存資料的核心機制。理解不同類型變數的特性、作用域與命名慣例,是撰寫清晰、可維護程式碼的基石。本文將系統性介紹 Ruby 的五大變數類型、擬變數、常數與基本字面值,並搭配實戰範例說明。

一、Ruby 的五大變數類型

1. 全域變數

全域變數以 $ 開頭(如 $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 中,於變數或常數前加上 # 可直接插入其值(字串插值)。

2. 實例變數

實例變數以 @ 開頭(如 @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

3. 類別變數

類別變數以 @@ 開頭(如 @@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

4. 區域變數

區域變數以小寫字母或底線 _ 開頭,作用域僅限於定義處所在的類別、模組、方法或區塊(do...end 或 {...})。未初始化的區域變數若被引用,會被視為無參數方法呼叫。生命週期在編譯階段即確定。

5. 常數

常數以大寫字母開頭(如 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
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved