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”

在这种表示法中,可以定义任意的符号 ( 但不能包含 ”<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”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值