使用remove_instance_variable与set设置为nil

Use*_*159 3 ruby

考虑一下

class SomeClass
  attr_reader :var

  def initialize
    @var = 42
  end 

  def delete_var
    remove_instance_variable(:@var)
  end

  def delete_var_2
    @var = nil
  end
end
Run Code Online (Sandbox Code Playgroud)

delete_var和delete_var_2有什么区别?

tom*_*ave 5

设置变量以nil保留作为容器的变量,但将包含的值更改为nil.

删除变量,然后将其删除.

在实例变量的情况下,它没有太大变化,至少在您的示例中.
原因是访问未定义的@instance变量将返回nil,因为这是Ruby的预期行为:

$ irb
2.1.0 :001 > var
NameError: undefined local variable or method `var' for main:Object
    from (irb):1
    from /Users/Tom/.rvm/rubies/ruby-2.1.0/bin/irb:11:in `<main>'
2.1.0 :002 > @var
 => nil 
2.1.0 :003 > 
Run Code Online (Sandbox Code Playgroud)

但是,这种相似性仅限于读取操作的结果.实际上,删除变量与将其设置为nil不同:

$ irb
2.1.0 :001 > 
2.1.0 :002 >   defined? @var
 => nil 
2.1.0 :003 > @var = nil
 => nil 
2.1.0 :004 > defined? @var
 => "instance-variable" 
2.1.0 :005 > 
Run Code Online (Sandbox Code Playgroud)