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继承中的行为不同。实例变量和类实例变量之间没有区别,因为没有类实例变量。类是与任何其他对象一样的对象,因此,它们可以与任何其他对象一样具有实例变量。这没有什么特别或不同。