符号
在字符串上使用符号的优点:
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