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,有可能会导致内存耗尽而导致程序奔溃。

Ruby Hash与ActiveSupport’s HashWithIndifferentAccess对于key的区别的更多相关文章

  1. ruby hash 默认值的问题

    参考:http://stackoverflow.com/questions/16159370/ruby-hash-default-value-behavior 使用ruby hash 默认值为空数组, ...

  2. Ruby  Hash类

    Hash类 更新:2017/06/15 获取没有的哈希值时返回nil 更新:2018/01/03 增加merge! 更新: 2018/04/05 增加搜索 key 更新: 2018/04/30 增加e ...

  3. ruby hash排序

    参考文章:http://blog.csdn.net/ppp8300885/article/details/49933305 a={a:1,b:20,c:3,d:0,e:7}逆序 a.sort{|k,v ...

  4. Listbox与Listbox with key的区别

    标准解释: ListboxVisualization as listbox in which a list of entries is displayed with one short descrip ...

  5. python dict.get()和dict['key']的区别

    先看代码: In [1]: a = {'name': 'wang'} In [2]: a.get('age') In [3]: a['age'] --------------------------- ...

  6. MySql表中key的区别

    我们看到Key那一栏,可能会有4种值,即'啥也没有','PRI','UNI','MUL'1. 如果Key是空的, 那么该列值的可以重复, 表示该列没有索引, 或者是一个非唯一的复合索引的非前导列2. ...

  7. dict.get('key')和dict['key']的区别

    dict['key']只能获取存在的值,如果不存在会触发KeyError dict.get('key', default=None)如果不存在,返回一个默认值

  8. mysql key index区别

    看似有差不多的作用,加了Key的表与建立了Index的表,都可以进行快速的数据查询.他们之间的区别在于处于不同的层面上. Key即键值,是关系模型理论中的一部份,比如有主键(Primary Key), ...

  9. Ruby中访问控制符public,private,protected区别总结

    重点关注private与protected public 默认即为public,全局都可以访问,这个不解释 private C++, “private” 意为 “private to this cla ...

随机推荐

  1. [ruby on rails] 跟我学之(9)删除数据

    首先需要在index页加个删除链接,并提供一个删除的确认,用户确认删除时,直接删除数据. 修改views 修改 app/views/posts/index.html.erb,如下: <h1> ...

  2. jlink安装

    https://www.segger.com/jlink-software.html?step=1&file=JLink_510p

  3. 设置windows网络连接别名和linux网络连接别名

    windows网络连接别名 C:\Windows\System32\drivers\etc目录下的hosts文件中添加 127.0.0.1 localhost 192.168.1.100 proxy. ...

  4. swfit 中的类型属性说明

    swift 中不叫做类属性,叫类型属性,因为在swift中,struct 和enum也是可以有这种属性的,叫类属性明显不准. 有以下注意事项: 对于值类型(指结构体和枚举)可以定义存储型和计算型类型属 ...

  5. Java最常用的变量定义汇总

    Java最常用的数据类型有基本数据类型,字符串对象,数组,基本数据类型又分为:数值型(包括整形和浮点型),字符型,布尔型,下面用一个简单的程序把这些数据类型汇总一下 public class Java ...

  6. codeforces 485B Valuable Resources 解题报告

    题目链接:http://codeforces.com/problemset/problem/485/B 题目意思:需要建造一个正方形的city,这座city的边需要满足平行于 x 轴和 y 轴,而且这 ...

  7. 村村通(codevs 2627)

    题目描述 Description 农民约翰被选为他们镇的镇长!他其中一个竞选承诺就是在镇上建立起互联网,并连接到所有的农场.当然,他需要你的帮助. 约翰已经给他的农场安排了一条高速的网络线路,他想把这 ...

  8. python基础——列表生成式

    python基础——列表生成式 列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式. 举个例子,要生成list [1, 2, 3, 4 ...

  9. C++基础(1)

    1.关于继承及访问. C++中 public,protected, private 访问标号小结,即访问标号使用限制. 第一:private, public, protected 访问标号的访问范围. ...

  10. Android主题换肤实现

    本系列文章主要是对一个Material Design的APP的深度解析,主要包括以下内容 基于Material Design Support Library作为项目整体框架.对应博文:Android ...