前情提要:

第六天我们透过Ruby代码练习public,protected和privatemethod时,发现冒号在前面的参数,:mydraft,:myspace,这些就是符号Symbol。在今天,我们就来解释Symbol吧!

Ruby经典面试题目#07
符号和字串有什么不同?What’s difference between symbol and string?

还记得我之前IT邦文章在Ruby on Rails项目例子中研究ruby的gem套件时,我发现这两者写法的功能是一样的:

:image_directory => 'tingsimage'
功能跟下者一样:

image_directory: 'tingsimage'
:冒号在前面,意思是符号

冒号在后面:,意思是给值

当时的发现,也是造就本篇文章想进一步探讨跑来跑去的小淘气冒号的原因。

比一比符号symbol字串string
意思有名字的符号物件指向字串物件的变数(leafor)
可不可变不可变immutable可变mutable
修改数组不可使用[]=方法可使用[]=方法修改字串
数组方法可使用[]取得数组内的字元可使用[]取得数组内的字元
字元方法可使用.length .upcase .downcase可使用.length .upcase .downcase
符号与字串转换符号转字串.to_s字串转符号.to_sym
我们来用代码实验看看:

tingsmessage =“This is my 7th article!”
tingsmessage这个变数,指向“This is my 7th article!”这个字串物件,变数的用意,就是让我的字串物件可以随时做调整。(明天我的message跑马灯就会换成第八天的招呼啰!)

如果我们把它变成::tingsmessage的符号呢?

它就会变成Symbol类别下的物件实体,名字叫做tingsmessage。

来用代码实作:

:tingsmessage这个符号,名字有12个字元,名字的第1个字母是t(数组位置[0]代表第1个),第2个字母是i…以此类推:

p:tingsmessage.length #12
p:tingsmessage.upcase #TINGSMESSAGE
p:tingsmessage[0] #t
p:tingsmessage[1] #i
而tingsmessage这个每天都会变来变去的变数,所指向的字串,一共有23个字元:(不信你数数看!)

tingsmessage =“This is my 7th article!”
p tingsmessage.length #23
p tingsmessage.upcase #THIS IS MY 7TH ARTICLE!
p tingsmessage[0] #t
p tingsmessage[1] #h
身为变数的好处就是可以任意修改。我们来试试改字母:

tingsmessage[1] =“Z”
p tingsmessage[1] #Z
p tingsmessage #TZis is my 7th article!
然而符号呢?

:tingsmessage[1]=“Z”
#undefined method `[]=' for:tingsmessage:Symbol(NoMethodError)
符号会找不到[]=方法修改字串。你可以想像,符号就如同我们在护照上的名字,是不能修改的。(因为已经被定义在国际间海关通用的数据库了。)

符号的好处是专一,它被写在程序里固定的內存位置,所以提取性能较高。我们可以用object_id的方法来实验:

3.times do
p:tingsmessage.object_id
end

印出结果:

1041308
1041308
1041308
而变来变去的变数每次都在內存里面,搬家到不同位置:

3.times do
p“tingsmessage”.object_id
end
印出结果:

46936214509440
46936214509260
46936214509180
在前述比较表,符号和字串之间可以互相转换的。

p:tingsmessage #:tingsmessage
p:tingsmessage.to_s # tingsmessage前面的冒号已经不见了!

p tingsmessage # TZis is my 7th article!
p tingsmessage.to_sym #:TZis is my 7th article!前面多一个冒号
何时使用符号Symbol
需要性能较高地传递参数时,例如在之前我们使用rails建立项目,餐厅名字、电话等…,这些数据库字段的名称是固定不变的:

def restaurant_params
params.require(:restaurant).permit(:name,:address,:phone,:website,:image)
end
回到文初一开头,我终于明白,

{:image_directory => 'tingsimage'}
其实是符号Symbol用在Hash(外围被大括号{}包着)里,是变数给值=>的意思。

今天超级比一比,就到这里结束啦(xcsjbj)!

比一比符号symbol字串string
意思有名字的符号物件指向字串物件的变数
可不可变不可变immutable可变mutable
修改数组不可使用[]=方法可使用[]=方法修改字串
数组方法可使用[]取得数组内的字元可使用[]取得数组内的字元
字元方法可使用.length .upcase .downcase可使用.length .upcase .downcase
符号与字串转换符号转字串.to_s字串转符号.to_sym
===

最新文章

  1. Sortable – 简单灵活的 JavaScript 拖放排序插件
  2. (十二) 一起学 Unix 环境高级编程 (APUE) 之 进程间通信(IPC)
  3. 转 SVN 在vs中的使用
  4. .net基础知识
  5. js中日期转换为时间戳
  6. PHP开发APP接口(二)
  7. SQL Server 2008文件与文件组的关系
  8. 第一篇博客关于Log4net的配置记录
  9. Android开发工具综述,开发人员必备工具
  10. AR9531的mac地址
  11. Spring基本使用方法_Bean对象
  12. 如何实现VM框架中的数据绑定
  13. 【微信小程序】rpx尺寸单位的应用
  14. PowerDesigner表设计中的P F M分别代表什么意思?
  15. HTML标签有序标签和无序标签
  16. kubeadm安装Kubernetes V1.10集群详细文档
  17. typescript 的安装
  18. 安装 pygame,找不到Python version 2.7
  19. Windows API串口编程详解
  20. zookeeper学习资料汇总

热门文章

  1. 安装owncloud出现:Error while trying to create admin user: An exception occurred while executing
  2. GP中Geoprocessor.Execute(string name, IVariantArray parameters, ITrackCancel trackCancel)
  3. bpmn-js起步
  4. C/C++程序中内存被非法改写的一个检测方法
  5. MacOS:Django + Python3 + MySQL
  6. linux: 用户组, 文件权限详解
  7. JS代码简单一段即可破解QQ空间删除说说
  8. 记录7: office 2016 Mac不能使用的解决过程
  9. linux ssl证书配置(apache)
  10. 样式初始化(copy)