Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby中的实例变量访问_Ruby - Fatal编程技术网

Ruby中的实例变量访问

Ruby中的实例变量访问,ruby,Ruby,我有一个类定义的代码: class Test attr_accessor :state @state = 4 def check_state puts "state is #{@state}" end end obj = Test.new obj.check_state 没有实例变量值的输出 但是如果我在obj.check_state之前调用obj.state=4,我将得到 州是4 为什么呢 谢谢。在当前代码中,您是在测试类上定义实例变量,而不是在测试实例上定义实

我有一个类定义的代码:

class Test
  attr_accessor :state

  @state = 4

  def check_state
    puts "state is #{@state}"
  end
end

obj = Test.new
obj.check_state
没有实例变量值的输出

但是如果我在obj.check_state之前调用obj.state=4,我将得到 州是4

为什么呢


谢谢。

在当前代码中,您是在测试类上定义实例变量,而不是在测试实例上定义实例变量。也就是说,您可以使用类方法访问它:

class Test
  @state = 4
  def self.state
    @state
  end
end

# Test.state
#  => 4
但这不是你想要的;您不希望该值出现在类中,而是希望它出现在类的每个实例中。要在类的实例上初始化实例变量,应提供构造函数:

class Test
  attr_accessor :state

  def initialize
    @state = 4
  end

  def check_state
    puts "state is #{@state}"
  end
end

# Test.new.state
#  => 4

类定义内的自可变当前对象是类对象本身,而不是接收方对象。 self是receiverobj,仅在方法定义内

48分钟

    class Test 
      attr_accessor :state  
      puts self.inspect
      @state = 4
      def check_state    
        puts "state is #{@state}"    
        puts self.inspect   
      end
   end
  obj = Test.new
  obj.state=4
  obj.check_state

所以实例变量和类实例变量之间的唯一区别是一个是内部实例方法,另一个是外部实例方法?有点类似。类本身就是实例,因此可以有实例变量。也有类变量,例如。@@state,但它们在WRT继承中的行为不同。实例变量和类实例变量之间没有区别,因为没有类实例变量。类是与任何其他对象一样的对象,因此,它们可以与任何其他对象一样具有实例变量。这没有什么特别或不同。