辛星浅析ruby中的symbol
2015-11-12 21:09
706 查看
最近有位朋友问我如何理解ruby中的symbol,我也不知道如何解释,就在这里大致说一下自己的理解吧。
第一点,symbol怎么表示。
其实它和字符串的使用有点相似,它就是在字符串前面加上两个冒号即可,比如 :a 和 :"a"都是合法的symbol,而且它们指向的是同一个地方。
第二点,ruby内部就大量的使用symbol。
我们可以使用Symbol.all_symbols来查看当前都有哪些符号,就我目前来说就有四千多个,我们来个范例:
irb(main):002:0> Symbol.all_symbols.size
=> 4481
irb(main):003:0>
第三点,为什么要使用symbol。
这要从ruby的特性说起,因为ruby是一个完全的面向对象的语言,而且需要注意的是,如果我们声明两个"star"变量,它会分配两块内存,因此每声明一个字符串都会带来额外的内存开销,因此ruby就引入了symbol来节省内存开销。正如它的初衷一样,如果我们声明两个"star"的symbol,则只占用一块内存。而且类似需要占内存的东西还有很多,而ruby就可以把它们当做symbol来处理,这样,不论声明多少个,都只会占用同一块内存。
从这个角度上讲,当我们使用字符串只是来标记一个事物的时候,比如我们只是用它来作为散列表的下标使用,就可以考虑使用symbol。而在rails这种框架中尤其明显,因为可能我们需要不断的在各个方法中传递数据,会产生很大的内存开销,这时使用symbol就是一个相当不错的方式。
第四点,symbol与其他类型的关系。
需要记住的是,symbol只是一个标记,而字符串是一个对象,因此很多在字符串中可以执行的操作,在symbol中是无法执行的,它只是起到一个占位符的作用。不过我们可以通过to_s方法把一个symbol升级成为一个字符串,但是它不允许被再赋值。
暂时就先介绍到这里啦,可能思路有点混乱,之后再进行整理。
第一点,symbol怎么表示。
其实它和字符串的使用有点相似,它就是在字符串前面加上两个冒号即可,比如 :a 和 :"a"都是合法的symbol,而且它们指向的是同一个地方。
第二点,ruby内部就大量的使用symbol。
我们可以使用Symbol.all_symbols来查看当前都有哪些符号,就我目前来说就有四千多个,我们来个范例:
irb(main):002:0> Symbol.all_symbols.size
=> 4481
irb(main):003:0>
第三点,为什么要使用symbol。
这要从ruby的特性说起,因为ruby是一个完全的面向对象的语言,而且需要注意的是,如果我们声明两个"star"变量,它会分配两块内存,因此每声明一个字符串都会带来额外的内存开销,因此ruby就引入了symbol来节省内存开销。正如它的初衷一样,如果我们声明两个"star"的symbol,则只占用一块内存。而且类似需要占内存的东西还有很多,而ruby就可以把它们当做symbol来处理,这样,不论声明多少个,都只会占用同一块内存。
从这个角度上讲,当我们使用字符串只是来标记一个事物的时候,比如我们只是用它来作为散列表的下标使用,就可以考虑使用symbol。而在rails这种框架中尤其明显,因为可能我们需要不断的在各个方法中传递数据,会产生很大的内存开销,这时使用symbol就是一个相当不错的方式。
第四点,symbol与其他类型的关系。
需要记住的是,symbol只是一个标记,而字符串是一个对象,因此很多在字符串中可以执行的操作,在symbol中是无法执行的,它只是起到一个占位符的作用。不过我们可以通过to_s方法把一个symbol升级成为一个字符串,但是它不允许被再赋值。
暂时就先介绍到这里啦,可能思路有点混乱,之后再进行整理。
相关文章推荐
- ruby 开发神器 rubymine的使用教程
- 如何在Mac OS X上安装 Ruby运行环境
- ruby 闭包
- ruby 循环
- Upgrade/Install ruby 2.1.2
- Ruby多线程编程
- MAC机中安装ruby环境--转载
- ubuntu crontab自动执行ruby脚本
- Ruby中实现把字符串转换为类的2种方法
- [No000041]如果你被ruby惯坏了,不如试试python3-在Windows下安装ipython
- ruby Math
- Ruby 命名
- Ruby-元编程和自定义访问器attr_accessor
- RubyGems 镜像
- Ruby程序中创建和解析XML文件的方法
- RESTful in ruby on rails
- 对优化Ruby on Rails性能的一些办法的探究
- 编写Ruby脚本来对Twitter用户的数据进行深度挖掘
- Ubuntu 14.04 LTS 系统中使用rbenv配置Ruby on Rails环境
- ruby 代码检测工具