Ruby 如何删除对象(具有整数标识符)?

Ruby 如何删除对象(具有整数标识符)?,ruby,Ruby,我想删除一个对象,我不能。以下是一个例子: 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的未使用对象 但是

我想删除一个对象,我不能。以下是一个例子:

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的未使用对象

但是不,我不想那样。我想删除这个对象


谢谢你的任何想法和建议。

我认为你做不到,这是一件好事,因为

>> 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
被“删除”

不能在Ruby中取消定义局部变量。可以使用remove_class_variable、remove_instance_variable和remove_const,但不能对局部变量执行此操作

在代码中,您实际上正在删除字符串对象,或者至少垃圾收集器正在删除它。你唯一保留的是一个指针,名为str,指向nil。但实际的字符串对象将不再存在

确保变量未定义的一种方法是将它们包装在过程中。当然,这样做的缺点是必须创建一个Proc,而且让Ruby执行垃圾收集要容易得多。如果您确实想使用proc,它将定义自己的绑定,您可以强制使用局部变量,如下所示:

Proc.new{ |;str| str = "hello"; puts str.object_id }.call
  2227691880
  => nil
defined?(str)
  => nil

请记住,Ruby是一种面向对象的编程语言,因此更容易处理对象内部的变量,而不必担心全局范围的变量。如果您的变量是在函数和对象内部定义的,那么这些变量对于这些函数和对象来说仍然是局部的,并且在删除这些对象后将不再存在。

。请解释清楚,我不确定我是否理解你的问题…你说的“删除”和“删除”是什么意思?@Andrew Grimm:我们可以使用删除、删除、销毁。。。如您所愿:)如果您执行与
ObjectSpace等效的操作。_id2ref(2227691880)
(数字当然会有所不同),您仍然会得到
“hello”
。甚至在调用GC.start之后,出于某种原因,我尝试使用ObjectSpace.garbage\u collect,然后调用ObjectSpace.\u id2ref,对象已被回收。如果您先调用_id2ref,然后在控制台中调用垃圾收集,则必须执行两次,因为u仍然存储引用。P.S:@Andrew Grimm-这同样适用于GC.start。如果您在控制台中调用此函数,请记住保留引用的内容。例如,如果调用proc,然后调用GC.start,然后调用_id2ref,您将看到对象被回收。如果调用proc,然后调用_id2ref,然后调用GC.start,那么对象将不会被回收,因为_id2ref将对象存储在u中。罗比:当然,我非常理解。但假设(就像我一样)你想这样做,尽管如此。实际上,您可以显式地创建一个新对象,但不能显式地销毁它,这并不是真正的逻辑。