比较详细的ruby symbol 学习资料

解释的不错,应该明确了不少 
ruby symbol详解
起因
最近在学习ruby on rails,的确是一个优秀的数据库开发框架。但在过程中,发现在视图文件夹中的rhtml文件里有大量的类似于以下的语句:
<td><%= link_to recipe.title, :action => “show”, :id => 1 %></td>
这是一个指向链接,如果没有冒号这句话的意思很好理解:这是一个指向http://127.0.0.1:3000/recipe/show/1的连接,也就是“显示”数据库表recipe中“id”为1的条目的信息,但让人不解的是action和id前面的冒号,它们是干甚么用的?

ruby面向对象特性的一个缺点
ruby中,一切皆是对象。就一个简单的字符串举例:
ruby -e ‘puts “hello world”.class'
String
这里打印了”hello world”的字符串所属的类,结果显示它是一个String对象的实例。我们还可以显示它的对象号。
ruby -e ‘puts “hello world”.object_id'
41436168
ruby一向标榜自己是完全的面向对象的原因就在于此,它的确做的很彻底。但是凡事有好就有坏,一个对象占用的内存空间显然会比纯粹的变量大得多,当程序中涉及到大量的字符串时,一个ruby程序会占用过多的内存。举个例子说:
我们用hash列表来存储歌曲的信息
song1 = { ‘title' => ‘used to love you', ‘artist' => ‘john legend'}
song2 = { ‘title' => ‘i still', ‘artist' => ‘backstreet boys'}
#……
#很多歌,这里只用两首
for i in 1..2
 thesong=”song”+i.to_s
 eval <<-PROC
 #{thesong}.each_key { |key| puts key.object_id.to_s }
 PROC
end
结果:
41436144
41436408
41435904
41436000
因为object_id各不相同,在hash表中的各个key都是独立的String对象,即使内容相同(如'title'),ruby还是将其视为不同的对象,这样就无端地占用了不少内存。但事实上,大多数情况下,我们仅将hash中的key视为字段而已,不会涉及到String类的方法,ruby自动将其设置为对象有杀鸡用牛刀之嫌。

symbol是什么
直译来说就是“符号”,在ruby就是形如:action这样的,一个冒号后跟一段字符串。显然,根据“一切都是对象”定律,它也是一个对象。
ruby -e ‘ puts :action.class ‘
Symbol
这个对象存在的意义在于,它解决了“同内容字符串,不同对象”带来的过多占用内存的问题。简单的说:action代表了'action'字符串,这里说的是字符串,不是字符串对象。
ruby -e ‘ puts :action ‘
action
更确切的讲就是一个symbol对象代表该对象的冒号后的字符串。
ruby -e ‘ puts :action ‘
action
ruby -e ‘ puts :”hello world” ‘ 
hello world
所有同内容的字符串只需要一个标记对象就可以代替,这样减少了不必要的对象建立和内存占用。但是,正如我强调的“symbol代表的是字符串,不是对象”,因此不要希望标记可以使用String类的诸如capitalize,center等方法,如果使用的话只会得到提示方法未定义的错误报告:
ruby -e ‘ puts :action.capitalize ‘ 
-e:1: undefined method ‘capitalize' for :action:Symbol' (NoMethodError)
幸运的是,symbol提供了转换函数to_s用来生成一个字符串对象,它会提取字符串内容并将其升级为对象。
ruby -e ‘ puts :action.to_s.capitalize ‘ 
Action
另外,很重要的一点是,symbol没有赋值方法,换句话说symbol一旦定义,将不能改变。
ruby -e ‘ :action=”hello” ‘ 
syntax error
很遗憾,即使使用了to_s,赋值依然无法顺利进行,因为ruby会认为“to_s=”是一个未定义函数。除非明确地为被转换生成的字符串对象指定一个引用(但事实上在复制之后该连接的指向又发生了变化):
:action
myaction=:action.to_s
myaction=”lala”
puts myaction
结果:
lala
怎么使用symbol
任何可以使用symbol的地方都可以使用与之向对应的字符串对象。在rails中有建立类似javabean的方法:
attr_reader :action
它建立了一个读取实例变量@action的方法,也可以写成这样:
attr_reader “action”
反之,只要
字符串在程序运行过程中不用改变
字符串不必使用String类方法
那么我们可以放心用symbol来代替字符串对象,从而大大减少内存的占用,在rails中尤为明显。因为需要频繁地在各个控制方法和页面之间跳转和传出数据,大量的方法名由symbol来代替,及节约了内存也提高了运行速度。

(0)

相关推荐

  • 比较详细的ruby symbol 学习资料

    解释的不错,应该明确了不少 ruby symbol详解 起因 最近在学习ruby on rails,的确是一个优秀的数据库开发框架.但在过程中,发现在视图文件夹中的rhtml文件里有大量的类似于以下的语句: <td><%= link_to recipe.title, :action => "show", :id => 1 %></td> 这是一个指向链接,如果没有冒号这句话的意思很好理解:这是一个指向http://127.0.0.1:30

  • Android Kotlin全面详细类使用语法学习指南

    目录 前言 1. 类的声明 & 实例化 2. 构造函数 2.1 主构造函数 2.2 次构造函数 3. 类的属性 4. 可见性修饰符 5. 继承 & 重写 6. 特殊类 6.1 嵌套类(内部类) 6.2 接口 6.3 数据类 6.4 枚举类 总结 前言 Kotlin被Google官方认为是Android开发的一级编程语言 今天,我将主要讲解kotlin中的类的所有知识,主要内容包括如下: 1. 类的声明 & 实例化 // 格式 class 类名(参数名1:参数类型,参数名2:参数类型

  • 详细解析Ruby中的变量

    变量持有要使用的程序的数据的存储位置. Ruby支持的有五种类型的变量.在前面的章节中已经经历了一个简短描述以及这些变量.本章中介绍的这五种类型的变量. Ruby的全局变量: 全局变量以$开头.未初始化的全局变量的值是零,并使用-w选项产生警告. 全局变量的赋值会改变全局状态.这是不推荐使用全局变量.他们使得程序的含义模糊. 下面是一个例子显示使用全局变量. #!/usr/bin/ruby $global_variable = 10 class Class1 def print_global p

  • Python学习资料

    官方网站 : www.python.org Python is an interpreted, interactive, object-oriented programming language. It is often compared to Tcl, Perl, Scheme or Java. Python combines remarkable power with very clear syntax. It has modules, classes, exceptions, very h

  • CGI脚本入门学习资料

    CGI脚本是什么? CGI脚本是怎样工作的? 一个简单的例子 我能用CGI脚本吗? 你的服务器配置允许CGI脚本吗? 你能编程吗? 你应该用什么编程语言? 你的服务器设置正确吗? 如果你的服务器不是UNIX系统呢? 解剖CGI脚本 输出头部 输出数据部 带阐述的脚本 传递其他信息给脚本 创建特殊的脚本输出 以装载另一个文本响应 无响应 处理表单的脚本 表单格式和表单脚本 GET 和 POST URL 编码 问题 CGI 变量 解码程序 uncgi cgi-lib.pl 解码文件上传的输入 自己做

  • PHP学习资料汇总与网址

    PHP官方网站 ----http://www.php.net/英文水平可以的话,建议经常到这里逛逛,这里有最新最权威的技术文档和软件.中国PHP联盟 ----http://www.phpx.com/ 中文PHP资料全面,信息丰富,更新及时. (一)PHP技术文档超越PHP ----http://www.phpe.net/超越PHP网站是一个全新的.开放源码.非盈利性质的PHP教学站点.特色栏目有经典文章.Class下载等,并有在线的PHP交流社区 天极网---软件频道---PHP专辑 ----h

  • 一份python入门应该看的学习资料

    网上学习的时候总会遇到一些好的文章,分享给大家,也谢谢作者的分享. Python 简介 Python 是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言. Python 的设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号,它具有比其他语言更有特色语法结构. Python 是一种解释型语言: 这意味着开发过程中没有了编译这个环节.类似于PHP和Perl语言. Python 是交互式语言: 这意味着,您可以在一个Python提示符,直接互动执行写你的程序. P

  • 2020版Python学习路线图(附学习资料)

    python应该是近几年比较火的语言之一,很多人刚学python不知道该如何学习,尤其是没有编程基础想要从事程序员工作的小白,想必应该都会有此疑惑,包括我刚学python的时候也是通过从网上查找相关资料以及从学校课程学习才确定python学习的方向,为了帮助想从事python工作的小白,所以我把python学习的大致路线图以及每个阶段需要学习的具体内容都整理出来,希望能帮助零基础的小白少走一些弯路. Python 类库(模块)极其丰富,这使得 Python 几乎无所不能,不管是传统的 Web 开

  • jsp基础学习资料

    一. JSP 技术概述 在 Sun 正式发布 JSP(JavaServer Pages) 之后,这种新的 Web 应用开发技术很快引起了人们的关注. JSP 为创建高度动态的 Web 应用提供了一个独特的开发环境.按照 Sun 的说法, JSP 能够适应市场上包括 Apache WebServer . IIS4.0 在内的 85% 的服务器产品.即使您对 ASP "一往情深",我们认为,关注 JSP 的发展仍旧很有必要. ㈠ JSP 与 ASP 的简单比较 JSP 与 Microsof

  • C#中的正则表达式 学习资料

    C#中的正则表达式 Jeffrey E.F. Friedl写了一本关于正则表达式的书<精通正则表达式>.作者为了使读者更好的理解和掌握正则表达式,编造了一个故事.该书的语言以perl为主.据我所知C#中的正则表达式也是基于perl5.所以它们应该有许多的共同之处. http://ike.126.com 其实,我并不打算原封不动的对该书的内容进行翻译,一则这本书内容太多了,我根本就不胜任翻译这项工作:二则如果我真的把这本书翻译过来,同时把里面的代码换成C#,在没有征得原作者的情况下,可能有侵权的

随机推荐