在Ruby中创建对象的各种方法

时间:2011-11-18 18:45:40

标签: ruby memory-management

这些创建空Ruby Hash的方法有何不同?如果是这样的话?

myHash = Hash.new

myHash = {}

我只是想深入了解Ruby中的内存管理。

4 个答案:

答案 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]

这与内存管理无关。