符號

在字串上使用符號的優點:

1. Ruby 符號是一個 O(1) 比較的物件

要比較兩個字串,我們可能需要檢視每個字元。對於長度為 N 的兩個字串,這將需要 N + 1 個比較

def string_compare str1, str2
  if str1.length != str2.length
        return false
  end
  for i in 0...str1.length
    return false if str1[i] != str2[i]
  end
  return true
end
string_compare "foobar", "foobar"

但由於 foobar 的每個外觀都指向同一個物件,我們可以通過檢視物件 ID 來比較符號。我們可以通過一次比較來做到這一點。(O(1)

def symbol_compare sym1, sym2
  sym1.object_id == sym2.object_id
end
symbol_compare :foobar, :foobar

2. Ruby 符號是自由形式列舉中的標籤

在 C++中,我們可以使用列舉來表示相關常量的族:

enum BugStatus { OPEN, CLOSED };
BugStatus original_status = OPEN;
BugStatus current_status  = CLOSED;

但由於 Ruby 是一種動態語言,我們不擔心宣告 BugStatus 型別或跟蹤合法值。相反,我們將列舉值表示為符號:

original_status = :open
current_status  = :closed

Ruby 符號是一個不變的唯一名稱

在 Ruby 中,我們可以更改字串的內容:

"foobar"[0] = ?b # "boo"

但我們無法改變符號的內容:

:foobar[0]  = ?b # Raises an error

4. Ruby 符號是關鍵字引數的關鍵字

將關鍵字引數傳遞給 Ruby 函式時,我們使用符號指定關鍵字:

# Build a URL for 'bug' using Rails.
url_for :controller => 'bug',
        :action => 'show',
        :id => bug.id

5. Ruby 符號是雜湊鍵的最佳選擇

通常,我們將使用符號來表示雜湊表的鍵:

options = {}
options[:auto_save]     = true
options[:show_comments] = false