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

问题描述 投票:2回答:2

鉴于以下代码,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"
ruby
2个回答
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调用时打印后者。


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

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

© www.soinside.com 2019 - 2024. All rights reserved.