初始化哈希两次和清除有什么区别



假设我有一个hash = {1=>1,2=>2}来清除我可以hash = {}hash.clear执行的值。它们之间有什么区别?

根据文档,如果您看到clear方法的源代码,它会遍历哈希中的每个元素并将其删除。

当你执行hash = {}时,它只会创建一个新的空哈希对象,但如果该对象没有其他引用,旧对象仍将在内存中准备进行垃圾回收。

它们完全不同。

第一个将简单地将局部变量hash绑定到不同的对象。特别是,它不会像您声称的那样"清除值":

hash = {i: 'am', still: 'there'}
another = hash
hash = {}
another
# => {i: 'am', still: 'there'}

第二个实际上将清除值:

hash = {i: 'am', still: 'there'}
another = hash
hash.clear
another
# => {}

Atri的答案是正确的,但是当你使用重新赋值时,除了GC内存中仍然存在的哈希之外 - 如果数组仍然实际被另一个变量引用。

哈希是一个对象,变量只是一个指针或对它的引用。 #clear 清除对象本身,重新分配变量只是将变量指向新的哈希。

hash1 = {1=>1,2=>2}
hash2 = hash1
puts hash1 # => {1=>1,2=>2}
puts hash2 # => {1=>1,2=>2}
hash1 = {}
puts hash1 # => {}
puts hash2 # => {1=>1,2=>2}
hash1 = {1=>1,2=>2}
hash2 = hash1 
hash1.clear
puts hash1 # => {}
puts hash2 # => {}

最新更新