符号

在字符串上使用符号的优点:

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