这些创建空Ruby Hash的方法有何不同?如果是这样的话?
myHash = Hash.new
myHash = {}
我只是想深入了解Ruby中的内存管理。
答案 0 :(得分:5)
有许多方法可以在Ruby中创建Hash对象,尽管最终结果是相同类型的对象:
hash = { }
hash = Hash.new
hash = Hash[]
hash = some_object.to_h
hash = YAML.load("--- {}\n\n")
就内存考虑而言,空Hash明显小于其中具有奇异值的Hash。在较小的尺寸下,阵列往往比Hashes小,但在更大的尺度上会更有效。
但实际上,在Ruby中要记住的重要一点是,每次创建一个对象时,都会花费你某些东西,即使它只是一个无穷小的数量。如果您不必要地创建数十亿个对象,这些小命中就会加起来。
通常,您应该避免创建不会使用的结构,而是根据需要创建它们,如果不会不必要地复杂化的话。例如,典型的模式是:
def cache
@cache ||= { }
end
在调用此方法之前,永远不会定义缓存哈希值。在这种情况下节省的内存几乎无关紧要,但如果那是在加载大型配置文件或从数据库导入数百MB的数据,您可以想象在没有运用该数据的情况下节省的成本会很高。
答案 1 :(得分:2)
这两种方法完全相同。
答案 2 :(得分:1)
如上所述,这两者在操作上是等同的。如果您指的是标准MRI / YARV;也许这个帖子会有所帮助:http://www.ruby-forum.com/topic/215163#new。
答案 3 :(得分:0)
使用Hash.new语法,您可以指定在哈希值中不存在某个键时要执行的操作(default behaviour)。使用{}语法需要另一步。
my_hash = Hash[]
是另一种创建数组的方法; []方法需要偶数个参数。
my_hash = Hash[:a, 1, :b, 2]
这与内存管理无关。