Symbol对象

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”

在这种表示法中,可以定义任意的符号 ( 但不能包含 0” )

:”…” 中,反斜线表示法 (“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
    
    
    
  • 用途
    1. 可用在 method 參數列上當做參數之 keyword,
      例如: redirect_to(:controller => “login”, :action => “login”)
    2. enumerated values
    3. 當 map/hash table 的 key
      例如: flash[:notice] = “Invalid user/password combination”
  • 參考資料 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

你可能感兴趣的:(ruby,&,ruby,on,rails)