`
koska
  • 浏览: 16757 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

理解Ruby中的标志(Understanding Ruby Symbols)

阅读更多

理解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) 如果侧重于对象的身份,就用标志。

分享到:
评论

相关推荐

    Ruby Pocket Reference.pdf

    符号(Symbols)在 Ruby 中是一种非常有用的资源,常用于提高性能和代码可读性。它们是不可变且唯一的对象标识。 #### 预定义变量和伪变量 预定义变量(Predefined Variables)和伪变量(Pseudovariables)在 Ruby...

    Ruby on Rails入门经典代码

    本压缩包中的"Ruby on Rails入门经典代码"提供了新手学习Rails的宝贵资源,帮助初学者快速掌握这个强大的框架。 1. **Rails基础知识**: - MVC架构:Rails的核心设计模式,模型负责数据处理,视图负责展示,控制器...

    Ruby袖珍参考手册

    - Ruby中有一些关键字是被语言本身保留使用的,例如`if`、`else`等。了解这些保留字对于理解Ruby语法至关重要。 **2. Operators(运算符)** - Ruby支持多种运算符,包括算术运算符(如加、减、乘、除)、比较...

    Ruby.Pocket.Reference

    ### Ruby Pocket Reference: Key IT Knowledge Points #### Title and ...It serves as a comprehensive guide for both beginners and experienced developers looking to deepen their understanding of Ruby.

    SF Symbols.7z

    此SF-Symbols资源由苹果官方文件中提出的纯净Fonts字体文件,不含其他苹果系统的辅助配置。 SF-Symbols 适用于iOS的Apple UI设计资源包括Sketch,Photoshop和Adobe XD模板,以及全面的UI资源,这些资源描述了使用...

    Ruby Pocket Reference

    These lists are invaluable for understanding the capabilities of these core Ruby constructs. #### Advanced Topics - **`sprintf` and Time Formatting Directories:** Ruby provides powerful string ...

    winxp符号文件包完整(symbols)

    在Windows XP系统中,开发和调试驱动程序是一个关键任务,而符号文件(Symbols)在此过程中起着至关重要的作用。符号文件(.pdb 文件)包含了操作系统、应用程序或驱动程序的调试信息,如变量名、函数名、行号等,...

    ruby初学笔记ruby初学笔记

    6. **符号(Symbols)**:在Ruby中,符号是不可变的对象,常用于哈希键,因为它们在内存中只保存一份,提高了效率。 7. **模块(Modules)**:模块用于实现代码复用和封装,可以包含方法、常量和类定义。通过`...

    ruby 书籍1

    在 Ruby 书籍中,我们可以深入理解这种语言的核心概念和实践技巧。 1. **面向对象编程**: Ruby 的核心就是面向对象编程(OOP),所有的一切都是对象,包括基本类型如数字和字符串。Ruby 提供了类(Class)、模块...

    Node.js-log-symbols-为各种日志级别提供着色的符号

    `log-symbols` 模块的主要功能在于它为常见的日志级别(如信息、警告、错误等)提供了可视化的符号,这些符号在终端中会显示为不同的颜色,从而提高了日志的可识别性。例如,它可能会使用一个绿色的勾号(√)表示...

    ABAP FIELD-SYMBOLS 学习资料

    在ABAP编程中,FIELD-SYMBOLS是一个非常重要的概念,它允许我们动态地引用数据结构,无需预先声明具体的变量。这在处理多种不同类型的变量或处理结构化数据时非常有用,可以提高代码的灵活性和可维护性。下面将详细...

    windows的symbols文件

    在Windows操作系统中,调试符号(Symbols)是程序员和系统管理员在进行系统级调试时不可或缺的资源。这些符号文件,通常以PDB(Program Database)格式存在,提供了关于系统组件、驱动程序和其他二进制文件的详细元...

    Ruby

    9. **符号(Symbols)**:Ruby中的符号是不可变的字符串,常用于表示标识符,以提高效率。 10. **动态加载和自定义加载路径**:Ruby允许在运行时动态加载代码,通过`require`或`require_relative`实现,也可以...

    could not read symbols: Bad value

    在上面的示例中,我们使用了 CFLAGS 变量来设置编译器的选项。-O3 选项用于启用优化级别,而 -fPIC 选项用于生成位置无关代码。 在编译时,我们使用 ./configure 命令来生成 Makefile 文件。然后,我们使用 make ...

    Ruby基础知识-数据类型.pdf

    本文档旨在详细介绍Ruby支持的各种基本数据类型及其使用方法,包括但不限于Number(数值)、String(字符串)、Ranges(范围)、Symbols(符号)以及特殊值true、false和nil。此外,还会涵盖两种重要的复合数据结构...

    Electronics Abbreviations Symbols and Terms

    描述中提到的“Electronic abbreviations, symbols and terms”进一步强调了文档的焦点,即电子领域的专业缩写、符号和术语。文档列出了一系列与电子技术相关的书籍和教程,这些内容包括VHS录像原理、数字技术介绍、...

    wps-font-symbols.zip

    3. **资源包的使用**:"wps-font-symbols-master"可能是一个包含预览、示例或者字体文件的目录,用户解压后可以查看字体样式,甚至将字体文件安装到系统中,使WPS Office能够识别并使用这些新的字体和符号。...

    windows 7 debug symbols 32位 64位 sp1的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...

    ruby-snippets:只是一些想法或在Ruby中玩耍,有一天可能会推广到他们自己的项目中

    "ruby-snippets"项目看起来是一个集合,包含了一些作者在Ruby编程中实验性的想法和代码片段,可能用于未来更大项目的开发。这些代码片断展示了作者对Ruby语言特性的理解和应用。 在Ruby中,你可以发现许多强大的...

Global site tag (gtag.js) - Google Analytics