Symbol 对象用于表现 Ruby 解释器内的名字或一些字符串。它们自动地由 :name 或 :”string” 字面值自动生成。在程序运行期间,对于给定名字的字符串将创建同一 Symbol 对象,而不管名字的含意和上下文环境。
也就是说,符号 Symbol 是一种很专一的对象,计算时(就算是包含展开式),只要其结果是同一个字符串的话,它总是返回同一对象。例如,如果 Fred 是一个在上下文环境中,及另一个方法中,另一个类中的常量,则 Symbol:Fred 将在这三个上下文环境中是同一个对象。
既然 Symbol 对象是用来表示符号类,你就可以将一些字符串与 Symbol 对象组成一种一对一的对应关系。
在 Ruby 脚本中符号有二种书写方法:
:symbol
‘symbol’.intern
先看看第一种书写方式。下面是一些用第一种书写方式的符号例子:
:class
:lvar
:method!
:andthisis?
:$gvar
:@ivar
:@@cvar
:+ 等等
它的语法如下:
: 标识符
: 变量名
: 操作符
可以用于得到符号 Symbol 。在使用字面值来表示符号时, ’:’ 后面只能是标识符、方法名(包括 ‘!’ 、 ’?’ 等后缀)、变量名 ( 包括 ’$’ 等前缀 ) 或可重定义的操作符 ( 除此之外将引发语法错误,即操作符必须是那些可以作为方法进行再定义的操作符 ) 。
此外在高版本中,你也可以使用第二种书写方式的符号:
p :’foo-bar’ #=> :”foo-bar”
p :”foo-bar” #=> :”foo-bar”
p %s{foo-bar} #=> :”foo-bar”
在这种表示法中,可以定义任意的符号 ( 但不能包含 ”<chmetcnv tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="0" unitname="”">0”</chmetcnv> ) 。
在 :”…” 中,反斜线表示法 (“t,n,r,f” 等等 ) 和展开式 (“#{ 表达式 }” ) 都是有效的。
让我们再看看前面提到的 :Fred 的例子:
module One
class Fred
end
$f1 = :Fred
End
module Two
Fred = 1
$f2 = :Fred
end
def Fred()
end
$f3 = :Fred
# 由下面可以看出是同一个 Symbol 对象。
$f1.id #=> 2514190
$f2.id #=> 2514190
$f3.id #=> 2514190
下面文字来自于: http://anw.stikipad.com/ocean/show/Symbol
一開始接觸 ruby 時常會被 :symbol 這類寫法搞的很困惑, 在 ruby 中它們被稱為 “Symbol”
- 你可以把它看做是不可更改的字串
- 但實際上準確的講, 它應該只是一個帶有名字的物件
以 :symbol 為例, 其名字為 “symbol” 的物件. 跟 enum in C 的用法有點像(不是等同 enum). 不要把它想的太複雜, 也不要把它當字串用, 但可轉成字串.//in C enum Color { Red, Blue, Green }; Color fgclr = Color.Red; //in Ruby fgclr = :red puts fgclr puts fgclr.to_s bgclr1 = "blue".to_sym bgclr2 = :blue puts bgclr1 == bgclr2
- 用途
- 可用在 method 參數列上當做參數之 keyword,
例如: redirect_to(:controller => “login”, :action => “login”) - enumerated values
- 當 map/hash table 的 key
例如: flash[:notice] = “Invalid user/password combination”
- 可用在 method 參數列上當做參數之 keyword,
- 參考資料 http://www.rubygarden.org/ruby?UnderstandingSymbols
http://glu.ttono.us/articles/2005/08/19/understanding-ruby-symbols
http://www.oreillynet.com/ruby/blog/2005/12/symbols_strings_methods_and_va.html
http://www.oreillynet.com/ruby/blog/2005/12/digging_into_ruby_symbols_1.html