前情提要:

第六天我们透过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字串的更多相关文章

  1. 符号化Symbol(符号)体系

    http://apps.hi.baidu.com/share/detail/23143648# 符号化Symbol(符号)体系 ArcGIS Engine9.3为开发人员提供了32种符号,主要分为三大 ...

  2. 安装与配置windbg的symbol(符号)

    http://msdn.microsoft.com/en-us/windows/hardware/gg463028.aspx  windows symbols下载地址 本篇是新手自己写的一点心得.建议 ...

  3. Arcgis Engine 添加一个Symbol符号样式步骤

    public static void DrawPictureMarkerSymbol(IGlobe globe, String layerName) { //添加一个图层 ESRI.ArcGIS.Ca ...

  4. 想写一个 Sketch 插件 结果 一查不可收拾 ~~ 涉及到 Symbol 符号/ Layer 图层 / Overrides 可替换变量 等等

    var sketch = context.api() var document = sketch.selectedDocument; var selection = document.selected ...

  5. 运行时常量池中的符号引用/String.intern() /ldc指令

    运行时常量池,之前放在方法区(永久代)中,1.8之后被转移到元空间,放到了native memory中. 具体的数据结构是:(看对象的内存布局,句柄访问还是对象头中保存指向类的元数据的指针,这里以对象 ...

  6. 125. Valid Palindrome判断有效的有符号的回文串

    [抄题]: Given a string, determine if it is a palindrome, considering only alphanumeric characters and ...

  7. PHP中的特殊符号

    <?php 注解符号: // 单行注解 /* */ 多行注解 引号的使用 ' ' 单引号,没有任何意义,不经任何处理直接拿过来; " "双引号,php动态处理然后输出,一般用 ...

  8. Day09 -超级经典面试题:Ruby的a ||= b(or-equals)是什么意思呢?

    前情提要: 写了这一系列下来,发现Ruby有许多特别的方法.前几天提到String字串,并且接续着在第八天我们了解串接(concatenate)与插入interpolation#{}方法(就连加号+也 ...

  9. PHP常用符号和函数

    (转)最近在写PHP程序的时候发现了一些特殊的PHP符号,例如连续小于符号,三个小于符号,eot,eod,echo示例,print示例等,突然间 发现用这么久的PHP了,竟然连PHP的基本符号都没有认 ...

随机推荐

  1. Laravel5 快速认证逻辑流程分析

    Laravel5本身自带一套用户认证功能,只需在新项目下,使用命令行php artisan make:auth 和 php artisan migrate就可以使用自带的快速认证功能. 以下为分析登录 ...

  2. 【Algorithm】字符串编辑距离(Levenshtein距离)C++算法实现

    算法实现比较简单,但算法原理不明白,有空了再研究一下. unsigned LevenshteinDistance(const string& s1, const string& s2) ...

  3. xyplorer设置备忘

    xyplorer设置备忘https://www.cnblogs.com/liuzhaoyzz/p/9911665.html1.双击向上一级工具→配置→菜单,鼠标,安全性→鼠标→双击空白空间时向上一级. ...

  4. 阿里云ssl负载均衡证书配置

    https://www.chinassl.net/ssl_install/n683.html

  5. hibernate left join fetch 出错的问题

    1.首先说说manyToOne的问题 比如一个用户所在的组织机构,可能是多个,最多是四个,然后userEntity有下的代码: 关联查询: 第一种方式:代码如下 StringBuilder sql = ...

  6. 用最简单的话告诉你什么是ElasticSearch

    介绍 Elasticsearch 是一个分布式可扩展的实时搜索和分析引擎,一个建立在全文搜索引擎 Apache Lucene(TM) 基础上的搜索引擎.当然 Elasticsearch 并不仅仅是 L ...

  7. wine install

    # yum -y groupinstall 'Development Tools' # yum -y install libX11-devel libxml2-devel libxslt-devel ...

  8. asp代码写的,微信会员报名转发分享带上下级和邀约人关系并且能微信支付asp编号的

    昨天晚上应一个客户要求写了一套代码,实现的功能是: 在微信公众号上注册会员,获取用户的头像和微信名称,进入会员中心报名,报名成功成功后,他如果转发链接给别人,别人打开后则成为他的下级,上面那个算是一个 ...

  9. sqlserver查找使用了某个字段的所有存储过程

    当一个系统中使用了很多的表,并且存在大量的存储过程,当数据库中的某个表删除了某个字段,那么相应的存储过程也需要改动,但是我们不知道哪些存储过程使用了该字段,那我们该怎么办?我们可以从之前的文档一个一个 ...

  10. JVM-索引

    JVM内容梳理 JVM体系结构 Jvm的体系结构 JVM内存区域详解(Eden Space.Survivor Space.Old Gen.Code Cache和Perm Gen) JVM之堆内存(年经 ...