Ruby:为什么在类nil中定义了一个实例变量?

时间:2013-10-09 10:12:18

标签: ruby

class Something
  @b = [4432]
  def screen
    puts @b.class
  end
end
s = Something.new
s.screen

输出'Nilclass'。想知道,为什么在类中定义的实例变量总是NilClass的一部分?

6 个答案:

答案 0 :(得分:10)

实例变量属于一个对象(也就是一个实例),这就是它们被称为实例变量的原因。每个实例都有自己的实例变量。

在您的情况下,有两个对象:SomethingClass的实例)和sSomething的实例)。这两个对象中的每一个都有自己的一组实例变量。 Something有一个名为@b的实例变量,指向[4432]s没有名为@b的实例变量,因为您从未对其进行过分配,未初始化的实例变量会计算为nil

答案 1 :(得分:3)

您需要像这样设置:

class Something
  def initialize
    @b = [4432]
  end

  def screen
    puts @b.class
  end
end

你这样做的方式,变量属于Something类本身,而不是它的实例。观察:

class Something
  @b = [4432]
end


s = Something.new
s.instance_variable_get(:@b) # => nil # !> instance variable @b not initialized

Something.instance_variable_get(:@b) # => [4432]

答案 2 :(得分:2)

通常,实例变量必须在构造函数内定义,而在ruby中,默认构造函数初始化语法是

def初始化

end #these是ruby中的默认构造函数 所以当我们在构造函数中定义insatnce变量时,当我们创建一个类的实例时,那个实例/对象将包含实例变量的副本

最重要的是,尽管实例/对象包含实例变量,但实例/对象无法访问它,为什么因为默认情况下实例数据是私有的,所以为了访问它我们需要为这些实例定义getter和setter变量

class Something    
attr_accessor:b
def initialize
@b = [4432]
end
s=Something.new
puts"#{s.b}"

答案 3 :(得分:1)

因为变量@b不存在!对于例如以下内容会产生您看到的相同结果。

class Something
  @b = [4432]
  def screen
    puts @a.class  #=> note @a which is non-existent
  end
end
s = Something.new
s.screen

尽管

class Something
  @b = [4432]
  def screen
    puts @a.class
  end
  def self.screen
    puts @b.class
  end
end
s = Something.new

s.screen #=> NilClass    
Something.screen #=> Array

答案 4 :(得分:0)

如果在初始化程序之外初始化@b,则希望@b作用域为类变量,因此必须将其称为@@ b: @@ b对于所有Something Class实例具有相同的值

喜欢:

class Somthing
  @@b = [4432] 
  def initialize
    #[...]
  end

  def screen
    puts @@b.class 
  end 
end

答案 5 :(得分:0)

@JörgWMittag答案是对的。我只是不想添加,在类中定义一个实例变量!=在该类的实例中定义实例变量。要创建实例变量,在s实例中,您需要添加initialize方法,以便在类上调用new方法时触发。

def initialize(b_value = default_value)
  @b = b_value
end