Ruby中的实例变量访问

时间:2015-03-23 23:14:54

标签: 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"。

为什么?

感谢。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:-1)

类定义中的自变量(当前对象)是类对象本身而不是接收器对象。 self是receiver(obj),只在方法定义内部。

https://www.youtube.com/watch?v=X2sgQ38UDVY 在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