前情提要:

第六天我们透过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. 音频格式软件 GoldWave 支持V3

    版本:GoldWave v5.67 md5:36E78BE278908B6538CE24D41A6859BA sha1:36A00003562F071670588D29E573B2FB0D8FF40A ...

  2. 模板语言 自定义函数simple_tag

    模板语言自带的一些处理函数:通过管道符来处理 帮助方法:{{ item.event_start|date:"Y-m-d H:i:s"}}  转换成日期时间型{{ bio|trunc ...

  3. squid http,https, 代理,默认端口3128

    squid http,https, 代理,默认端口3128 https 代理时出现 403,是因为squid默认允许 192.168.0.0 网段代理 在配置文件中,““acl localnet sr ...

  4. python3-基础6

    函数嵌套调用: 再调用一个函数的过程中,又调用了其他的函数 函数的嵌套定义:在一个函数的内部,又定义另外一个函数,函数内部定义的变量,在外部不能被调用 名称空间:一种隔离的概念,专门用来存放名字的地方 ...

  5. js 去除左右空格

    /*****************************************************Method1*************************************** ...

  6. LeetCode【112. 路径总和】

    思路就是从根节点开始向下选节点,依次与sum比较大小,若小,则向下选左右节点其中一个,若大,则接下来判断是否是叶子节点,若是,则返回false 若不是,则上一步选另一节点,再将上述重新执行. 对于叶子 ...

  7. 页面中关于bootstrap框架的增删改查使用

    bootstrap是一个简单又好用的前端框架 1.bootstrap 初始化  表格显示 2.自带的查询表单(需要配置要查询的条件  对应实体类) 3.工具(增加和查询) 4.查询方法 5.增加方法 ...

  8. RocketMQ源码分析:(二)消息发送的三种方式

    1. 同步传输(可靠,适用于重要的通知消息.短信通知.短信营销系统等) package com.miaoying.rocketmq.client; import lombok.extern.slf4j ...

  9. CUDA编程模型——组织并行线程2 (1D grid 1D block)

    在”组织并行编程1“中,通过组织并行线程为”2D grid 2D block“对矩阵求和,在本文中通过组织为 1D grid 1D block进行矩阵求和.一维网格和一维线程块的结构如下图: 其中,n ...

  10. git 入门与应用

    git可视化界面的项目版本控制软件,适用于git项目管理 SourceTree 安装方法 https://blog.csdn.net/qq_26230421/article/details/79921 ...