Ruby Hash与ActiveSupport’s HashWithIndifferentAccess对于key的区别
2016-03-05 17:51
351 查看
Ruby Hash的key定义的时候是支持symbol或者string的,所以访问的时候只能是symbol或者string其中一种方式。
建议使用symbol定义Hash的key,因为symbol在Ruby中是不可变的,定义之后再内存中不会被回收。多次使用同一个symbol都是使用同一个symbol对象,具有相同的object_id。
而stirng key是可变的并且会被自动回收,每次引用相同的string都会生成一个新的string对象,具有不同的object_id。
当使用symbol key的时候,ruby通过直接通过symbol的object_id与内存中的hash object_ids对比,从而取得对应的值。
而如果是string key,ruby则需要获取到string的内容与已经存在内存中的hash的值对比来获取相应的值,所以会比使用symbol key的时候慢。
hash = Hash.new
hash[:abc] = 'abc'
hash['abc'] # puts nil
HashWithIndifferentAccess的特点是无论使用的是symbol key或者string key,都可以获取到对应的值:
hash = HashWithIndifferentAccess.new
hash[:abc] = 'abc'
hash['abc'] # puts abc
值的一提的是不要把用户输入的内容转为symbol key。因为symbol在ruby中占用的内存是不会自动被回收的。所以,如果将一个很长的字符串通过调用.to_sym转为symbol,有可能会导致内存耗尽而导致程序奔溃。
建议使用symbol定义Hash的key,因为symbol在Ruby中是不可变的,定义之后再内存中不会被回收。多次使用同一个symbol都是使用同一个symbol对象,具有相同的object_id。
而stirng key是可变的并且会被自动回收,每次引用相同的string都会生成一个新的string对象,具有不同的object_id。
当使用symbol key的时候,ruby通过直接通过symbol的object_id与内存中的hash object_ids对比,从而取得对应的值。
而如果是string key,ruby则需要获取到string的内容与已经存在内存中的hash的值对比来获取相应的值,所以会比使用symbol key的时候慢。
hash = Hash.new
hash[:abc] = 'abc'
hash['abc'] # puts nil
HashWithIndifferentAccess的特点是无论使用的是symbol key或者string key,都可以获取到对应的值:
hash = HashWithIndifferentAccess.new
hash[:abc] = 'abc'
hash['abc'] # puts abc
值的一提的是不要把用户输入的内容转为symbol key。因为symbol在ruby中占用的内存是不会自动被回收的。所以,如果将一个很长的字符串通过调用.to_sym转为symbol,有可能会导致内存耗尽而导致程序奔溃。
相关文章推荐
- ruby gems安装镜像
- iOS Mac系统下Ruby环境安装
- 安装ruby一定要注意的一步(ruby -v和 rbenv version结果不一致)
- 安装ruby一定要注意的一步(ruby -v和 rbenv version结果不一致)
- Ruby--Kernel#caller方法
- 有趣的Ruby-学习笔记6
- iOS_ruby环境的配置
- 安装 Ruby运行环境----> CocoaPods安装和使用图解
- 每个程序员都应该学习使用Python或Ruby
- 解决国内ruby gem不能用的问题
- ruby on rails 入门(1) 环境安装
- 有趣的Ruby-学习笔记5
- RubyCritic:一款不错的检测代码质量工具
- RubyCritic:一款不错的检测代码质量工具
- ruby安装
- Ruby中unless和if not明明相似,为何不去除一者?
- 10个基于 Ruby on Rails 构建的顶级站点
- 10个基于 Ruby on Rails 构建的顶级站点
- Ruby术语表
- mac上Ruby环境安装教程