`
koska
  • 浏览: 16743 次
  • 性别: 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.

    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 ...

    SF Symbols.7z

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

    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录像原理、数字技术介绍、...

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

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

    ruby:1233

    8. **符号(Symbols)**:Ruby中的符号是唯一的,不可变的对象,常用于哈希表的键,因为它们的比较速度比字符串快。 9. **异常处理**:Ruby使用`begin..rescue..end`来处理异常,这使得程序在遇到错误时能够优雅地...

    windows xp sp3 symbols full enu

    windows xp sp3 的symbols 包 。WindowsXP-KB936929-SP3-x86-symbols-full-ENU。 找了半天,没找到中文版的符号包,只找到英文版的,不过可以用。然后这个是full版的。

Global site tag (gtag.js) - Google Analytics