如何访问类<<中定义的实例变量自

时间:2018-02-28 17:25:36

标签: ruby

鉴于以下代码,Dog.speak如何不返回"here is the @var variable"

class Dog
  class << self
    @var = "here is the @var variable"

    def speak
      @var
    end
  end
end

p Dog.speak

而是返回nil

我的理解:class << self打开了Dog的单例类对象。在该单例对象上,我们设置了@var的实例变量。因此,我认为可以从@var访问Dog.speak的实例变量。

我在这里缺少什么概念?为什么@var方法无法访问speak

令人困惑的是,这可以按预期工作:

class Dog
  class << self
    def set_it
      @var = "The instance variable of @var is now accessible"
    end

    def speak
      @var
    end
  end
end

Dog.set_it
p Dog.speak # => "The instance variable of @var is now accessible"

2 个答案:

答案 0 :(得分:4)

您在单例类级别声明变量并尝试在类级别上访问它。调试输出是你的朋友:

class Dog
  class << self
    puts "I am #{self}"
    @var = "here is the @var variable"

    def speak
      puts "I am #{self}"
      @var
    end
  end
end

打印出来:

#⇒ I am #<Class:Dog>
▶ Dog.speak
#⇒ I am Dog

请注意,前者在解析代码时打印 ,只有在明确执行对Dog.speak的调用时才打印后者。

答案 1 :(得分:2)

  

Dog.speak如何回归"here is the @var variable"

出于同样的原因,原因如此:

class Dog
  @var = "here is the @var variable"

  def speak
    @var
  end
end

Dog.new.speak # => nil

您在类级别设置变量,并期望它在实例级别上可用。