Day07 - Ruby比一比:Symbol符号与String字串
前情提要:
第六天我们透过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
===
Day07 - Ruby比一比:Symbol符号与String字串的更多相关文章
- 符号化Symbol(符号)体系
http://apps.hi.baidu.com/share/detail/23143648# 符号化Symbol(符号)体系 ArcGIS Engine9.3为开发人员提供了32种符号,主要分为三大 ...
- 安装与配置windbg的symbol(符号)
http://msdn.microsoft.com/en-us/windows/hardware/gg463028.aspx windows symbols下载地址 本篇是新手自己写的一点心得.建议 ...
- Arcgis Engine 添加一个Symbol符号样式步骤
public static void DrawPictureMarkerSymbol(IGlobe globe, String layerName) { //添加一个图层 ESRI.ArcGIS.Ca ...
- 想写一个 Sketch 插件 结果 一查不可收拾 ~~ 涉及到 Symbol 符号/ Layer 图层 / Overrides 可替换变量 等等
var sketch = context.api() var document = sketch.selectedDocument; var selection = document.selected ...
- 运行时常量池中的符号引用/String.intern() /ldc指令
运行时常量池,之前放在方法区(永久代)中,1.8之后被转移到元空间,放到了native memory中. 具体的数据结构是:(看对象的内存布局,句柄访问还是对象头中保存指向类的元数据的指针,这里以对象 ...
- 125. Valid Palindrome判断有效的有符号的回文串
[抄题]: Given a string, determine if it is a palindrome, considering only alphanumeric characters and ...
- PHP中的特殊符号
<?php 注解符号: // 单行注解 /* */ 多行注解 引号的使用 ' ' 单引号,没有任何意义,不经任何处理直接拿过来; " "双引号,php动态处理然后输出,一般用 ...
- Day09 -超级经典面试题:Ruby的a ||= b(or-equals)是什么意思呢?
前情提要: 写了这一系列下来,发现Ruby有许多特别的方法.前几天提到String字串,并且接续着在第八天我们了解串接(concatenate)与插入interpolation#{}方法(就连加号+也 ...
- PHP常用符号和函数
(转)最近在写PHP程序的时候发现了一些特殊的PHP符号,例如连续小于符号,三个小于符号,eot,eod,echo示例,print示例等,突然间 发现用这么久的PHP了,竟然连PHP的基本符号都没有认 ...
随机推荐
- H5外包 微信小程序外包 小程序外包 就找北京动点开发团队
长年承接微信小程序.微信公众号开发 全职的H5开发团队,开发过几十款微信小程序公众号案例 欢迎来电咨询 QQ:372900288 微信:liuxiang0884 TEL:13911652504
- Python 目录整理
基础部分: 1 常量 2 字符编码 字符编码补充 3 编码集 4 break与continue 5装饰器 6 迭代器 7生成器 8面向过程 9模块 10包 11 递归调用 12文件的用途 13类 ...
- C#使用AppDomain时的异常分析:Object ‘XXXX.rem’ has been disconnected or does not exist at the server.
在使用C#的应用程序域的时候,碰到这么一个异常: System.Runtime.Remoting.RemotingException: Object ‘/76e7cd41_2cd2_4e89_9c03 ...
- mybatis 日志的使用以及设计
1.为什么要配置mybtis的logger? mybatis自己设计以及实现了org.apache.ibatis.logging.Log接口. Mybatis为了避免对第三方的日志包存在强依赖,内部的 ...
- 研究并尝试改进Vyeshal
我想研究Vyeshal,这样就不可避免的要用到游戏中的语音.然而游戏内的语音文件是.bank类型的,如何转化为可听文件是个问题.
- asp微信支付代码证书文件post_url.aspx和post_url.aspx.cs源码下载
很多朋友在网上找的asp支付代码中都没有这两个证书文件,只能是用别人的,但是如果别人把他的网站这个文件删了,你的支付也就不能用了,今天我就把大家需要的这两个asp微信支付代码证书文件post_url. ...
- SSD 的介绍 -------转载
本文转载自: http://www.sohu.com/a/258190629_494938 背景 SSD(Solid-State Drive)是目前正处于鼎盛时期的存储设备.相较于传统的硬盘存储器 ...
- 打包时,node内存溢出问题解决方法
在使用npm run build打包时,遇到node内存溢出问题. 网上查找到的决绝方案.解决方案一: 安装increase-memory-limit插件,扩大node的内存限制 但是,这个解决方案在 ...
- yidun验证码
from PIL import Imagefrom selenium import webdriverfrom selenium.webdriver import ActionChainsfrom s ...
- 文件服务之二:ftp协议
FTP连接 命令连接 传输命令(客户端发给服务端的命令),服务端的21/tcp 数据连接 传输数据(传输数据时建立,数据传输完拆除) 数据链接的建立方法:主动.被动 主动模式(PORTstyle服务器 ...