理解Ruby中的标志(Understanding Ruby Symbols)
原文出处:http://glu.ttono.us/articles/2005/08/19/understanding-ruby-symbols
翻译:Suninny AT Gmail.com
标志在Ruby中是一个迷。我们用她,但多数人并不真正懂她。
什么是标志?
简单来说,标志是你用来代表名字或字符串的一个东西。这可以归结为一种高效的描述名--产生单一的字符串用于每个命名实例,这样就节省了空间。
琼斯博士的案例
琼斯博士(Dr Jones)是个心理学家。 他通常使用语词联想试验诊断患者,并且使用Ruby记录一切。 他的第一名患者Why来到了这里:
Dr J: Red
Why : Ruby
Dr J: Transportation
Why : Rails
Dr J: Chunky
Why : Bacon
琼斯博士建立一个散列来存储这些数据:
why = {”red” => “ruby”, “transportation” => “rails”, “chunky” => “bacon”}
问题所在
在进行几百个语词联想试验之后,琼斯博士开始意识到他用尽了内存! 于是琼斯在irb进行测试:
> patient1 = { “ruby” => “red” }
> patient2 = { “ruby” => “programming” }
> patient1.each_key {|key| puts key.object_id.to_s}
211006
> patient2.each_key {|key| puts key.object_id.to_s}
203536
我们看到,每次他建立一个散列来存储信息,Ruby就在不同的内存位置为每个键建立了一个新的字符串对象。
幸运的是,我们还有其他的方法。
用标志来突围
不同于字符串,在一个Ruby会话期间,同一个名称的标志只作一次初始化然后就存在于内存中。当你需要重用字符串来表示其他东西时,标志是再适合不过的了。重做琼斯博士的测试,我们能直接观察到:
> patient1 = { :ruby => “red” }
> patient2 = { :ruby => “programming” }
> patient1.each_key {|key| puts key.object_id.to_s}
3918094
> patient2.each_key {|key| puts key.object_id.to_s}
3918094
通过使用标志,在语词联想试验中我们用单一的内存地址代表了“ruby”这个单词。随着时间的推移,这能节省下大量的空间。
标志的其他应用场合
无论何时,只要你是重用一个单词来反复代表其他东西,标志就能派上用场。不管是散列中的一个键,还是Http查询中的一个方法。在最新、最伟大的Web框架--Ruby on Rails的路由和链接中就应用到了标志。
在表现一个网页之前,Rails会执行框架内部的控制器(controllers)中定义的动作(actions),因此在Rails中,链接就像这样表示:
link_to(”View Article”, :controller => “articles”, :action => “show”, :id => 1)
当一个应用可能至少有数百个链接,或者说有数百个不同动作和控制器的引用时,使用标志就比使用字符串高效得多。
最后,值得注意的是标志的应用场合并不局限于散列中的键。例如,如果你写一个Http客户端(或服务器),在这个程序中,可能需要多次用到get和post:
do_this if query == :get
…
send_message_to_server(:post,filename)
当需要反复用到一个字符串时,标志或许是一个蛮不错的替代品。
更新
在Freenode(译注:一个著名的IRC服务器)的ruby-lang频道,Aria和Nome为这篇文章给出了有用的增补。
11:58 < Aria> 同样,即便完全出于现实方面的考虑,使用标志也很理想:如果你要引用一个方法名,就用标志吧,因为她总会在那里(在定义了方法之后)。
12:03 < nome> Kevin Clark:标志的目的是用来辨别构造(主要是用户级的):散列中的槽、一个方法、一个选项等等。
同样,Aria还回应了Geoff在注解中提出的问题:
Geoff:我很想知道1000个字符串”red”究竟要比:red耗费多少内存。记住,在Rails之外,”red” != :red
Aria:多少内存?20字节/对象,加上存储数据的3个字节,再加上存储长度的4个字节,一共是27×1000=27000个字节。与此相对,标志表条目的一份拷贝,只需几个字节。
Jim Weirich 写到:
我通常有下面的法则来比较字符串和标志:
(1) 如果侧重于对象的内容(即字符序列),就用字符串;
(2) 如果侧重于对象的身份,就用标志。
分享到:
相关推荐
Whether you've come to Ruby because of the Rails web development framework --Ruby's killer app -- or simply because it's a relatively clean, powerful and expressive language that's useful for a lot of...
operators, comments, numbers, variables, ranges, and symbols Predefined variables andglobal constants Conditional statements, method use, classes, and modules (mixins) Lists of methods ...
Electronics, Abbreviations, Symbols and Terms
Symbols Symbols is a Java library to generate static strings constants for attribute names using annotation processor. Tell me more In some cases, in Java (ex: when using reflection methods) we need ...
windows xp sp3 的symbols 包 。WindowsXP-KB936929-SP3-x86-symbols-full-ENU。 找了半天,没找到中文版的符号包,只找到英文版的,不过可以用。然后这个是full版的。
windows的symbols,包含了大部分系统的pdb文件,目前微软无法通过服务器下载pdb文件,特提供一份离线的pdb文件用于日常调试
常用的Latex字符命令,科技论文Latex写作必备指南。 常用的Latex字符命令,科技论文Latex写作必备指南。
could not read symbols: Bad value,只在64位linux下出现的问题,需要在编译时加上-fPIC
wps-font-symbols.zip
latex-symbols-letterlatex-symbols-letterlatex-symbols-letter
IB-Ruby使用相同的概念来组织和优化运营问题,并支持研究和系统的交易工作。 列表按Enumerator进行组织,以扩展其使用范围。 该功能完全存在于文件系统中,不需要数据库,不涉及任何进一步的依赖关系。 默认情况下...
有些电脑WindowsXP-KB936929-SP3-x86-symbols-full-ENU.exe无法自解压,可能是系统盗版啦,或者计数器已经出现问题,本来就是用来调试麻,所以上传一个我解压好了(880MB)再zip压缩的,方便那些苦难的人。
sketch-batch-create-symbols, 用于将选定图层转换为单个符号的插件插件 概述在草图中,当你有一些需要转换为符号的图层时,必须一个选择它们并使用'转换为符号'函数。 多个选择将合并为一个符号。这里插入将为当前...
winxp早期的符号pdb文件 ,对于学习驱动编程有帮助 VC++提示提示no symbols load... 这是Window xp sp3 调试符号(symbols)完整包
windows 7 debug symbols 不含win7 sp1的symbol If you plan to install symbols manually, it is crucial that you remember this basic rule: the symbol files on the host computer are required to match the...
LaTex and AMS-LaTex Symbols 文本符号 数学符号 其它字符
自动化学会标准。该标准规定了自动化仪器仪表在图形流程中的符号及标注的标准。
Five_Famous_Symbols_of_American_Culture.ppt
1.Linker Tools Error LNK1169 one or more multiply defined symbols found The build failed due to multiple ...也就是"在 Project/Setting/Link/General中的 Project Options: 加入 /FORCE:MULTIPLE即可
log-symbols - 为各种日志级别提供着色的符号