假设我有一个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 # => {}