class Something
@b = [4432]
def screen
puts @b.class
end
end
s = Something.new
s.screen
输出'Nilclass'。想知道,为什么在类中定义的实例变量总是NilClass的一部分?
答案 0 :(得分:10)
实例变量属于一个对象(也就是一个实例),这就是它们被称为实例变量的原因。每个实例都有自己的实例变量。
在您的情况下,有两个对象:Something
(Class
的实例)和s
(Something
的实例)。这两个对象中的每一个都有自己的一组实例变量。 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