我想删除一个对象,我不能。这是一个例子:
irb(main):001:0> str = "hello"
"hello"
irb(main):003:0> str.object_id
2164703880
irb(main):004:0> str = nil
nil
irb(main):005:0> str.object_id
4
如您所见,我可以将对象的变量设置为 nil (当然它的对象id将是4)。之后,垃圾收集器将自动删除ID为2164703880的未使用对象。
但不,我不想那样。我想删除这个对象。
感谢您的任何想法,建议。
答案 0 :(得分:1)
您无法在Ruby中取消定义局部变量。您可以使用remove_class_variable,remove_instance_variable和remove_const,但不能对局部变量执行此操作。
在您的代码中,您实际上是删除了字符串对象,或者至少垃圾收集器正在删除它。你唯一保留的是一个名为str的指针,指向nil。但实际的字符串对象将不再存在。
确保变量未定义的一种方法是将它们包装在Proc中。当然,这有必要创建一个Proc的缺点,让Ruby执行垃圾收集要容易得多。如果你想使用proc,它将定义它自己的绑定,你可以强制局部变量,如下所示:
Proc.new{ |;str| str = "hello"; puts str.object_id }.call
2227691880
=> nil
defined?(str)
=> nil
请记住,Ruby是一种面向对象的编程语言,因此处理对象内部的变量更容易,而不是担心全局范围的变量。如果你的变量是在函数和对象中定义的,那么它们对于那些函数和对象保持局部,并且一旦删除了对象就不再存在。
答案 1 :(得分:0)
我认为你不能,因为
,这是件好事>> str = "hello"
str = "hello"
=> "hello"
>> str2 = str
str2 = str
=> "hello"
>> str.object_id
str.object_id
=> 2157491040
>> str2.object_id
str2.object_id
=> 2157491040
>> str = nil
str = nil
=> nil
>> str.object_id
str.object_id
=> 4
>> str2.object_id
str2.object_id
=> 2157491040
>>
我不希望我的str2
消失,因为程序str
中的其他位置已被“删除”。