I'm trying to access a datamember of a parent class from a child
class. I am not sure how to call it. I have found a lot of info about
accessing class variables but not instance variables from a child
class. Here is my code:
class Shape
@var = "woohoo"
那个变量被称为类实例变量,人们使用类实例变量而不是类变量,即@@variable
的原因,就是为了防止子类访问它。由于类实例变量是其他语言中类变量的工作方式,因此在ruby中不太使用@@variables
,因为如果来自另一种具有类变量的语言,则其行为令人惊讶。
显然您的用例需要在子类中访问类变量,因此请使用@@variable
。
编辑:我希望子类的单个实例将“woohoo”字符串替换为它们自己的唯一字符串。
您可以使用类实例变量:
class Shape
@var = "shapehoo"
class <<self
attr_accessor :var
end
def display_class_instance_var
puts Shape.var
end
end
class Rectangle < Shape
@var = "recthoo"
def display_class_instance_var
puts Rectangle.var
end
end
class Circle < Shape
@var = "circlehoo"
def display_class_instance_var
puts Circle.var
end
end
Shape.new.display_class_instance_var
Rectangle.new.display_class_instance_var
Circle.new.display_class_instance_var
Rectangle.new.display_class_instance_var
Shape.new.display_class_instance_var
--output:--
shapehoo
recthoo
circlehoo
recthoo
shapehoo
与普通实例变量一样,
类实例变量是私有的,因此如果想要访问它们,您需要提供访问器方法。这些访问器方法需要在类的单例类中定义,您可以使用以下语法打开单例类:
class <<self
end
新增:
关于这段代码:
class Rectangle < Shape
@length
@width
def initialize ( l,w )
@length = l
@width = w
end
在你的initialize()方法中,你没有设置在方法上面声明的@length和@width变量。在Ruby中,@变量会附加到创建@变量时的
self
对象。以下是更详细的代码:
class Rectangle < Shape
@length
@width
def initialize ( l,w )
@length = l
@width = w
end
因此,在initialize()中创建的@variables会附加到新实例上,而在initialize()上面声明的@variables会附加到Rectangle类上,这意味着它们是完全不同的变量。
class <<self
而不是只使用访问器?”——因为在类级别调用attr_accessor
将为名为@var的实例变量创建访问器,而不是为名为@var的类实例变量创建访问器。2)“为什么要调用Rectangle.var而不是self.var?”——因为在实例方法中,self
等于调用该方法的实例,但是访问器方法是在类对象上定义的,所以您需要使用类对象调用访问器。您可以编写self.class.var
。 - 7stud