zoukankan      html  css  js  c++  java
  • Ruby Hash与ActiveSupport’s HashWithIndifferentAccess对于key的区别

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

  • 相关阅读:
    Linux Shell 重定向输入和输出
    NDK Cmake
    测试
    20行Python代码爬取王者荣耀全英雄皮肤
    SSH开发模式——Struts2(第一小节)
    JavaWeb开发——软件国际化(动态元素国际化)
    JavaWeb开发——软件国际化(文本元素国际化)
    DBUtils框架的使用(下)
    DBUtils框架的使用(上)
    SSH开发模式——Struts2(第二小节)
  • 原文地址:https://www.cnblogs.com/springdong/p/5245319.html
Copyright © 2011-2022 走看看