我试图从子类访问父类的数据库。我不知道怎么称呼它。我发现了很多关于访问类变量的信息,但没有找到子类中的实例变量。这是我的代码:
class Shape
@var = "woohoo"
def initialize ()
end
def area ()
end
end
class Rectangle < Shape
@length
@width
def initialize ( l,w )
@length = l
@width = w
end
def area ()
print @var
return @length * @width
end
end
我在尝试打印@var时遇到错误。我尝试了父。@ var,Shape。@ var,以及我期望从其他语言中获得的其他一些组合。在子类的实例中打印(如果可能的话)变量的正确方法是什么?
编辑:我希望子类的各个实例替换&#39; woohoo&#39;字符串有自己独特的字符串。
谢谢!
答案 0 :(得分:3)
我正在尝试从子级访问父类的数据库 类。我不知道怎么称呼它。我发现了很多关于的信息 访问类变量但不访问子项中的实例变量 类。这是我的代码:
class Shape @var = "woohoo"
该变量称为类实例变量,以及人们使用类实例变量而不是类变量的原因,即@@variable
,正是因为子类无法访问它。因为类实例变量是类变量在其他语言中的工作方式,所以@@variables
在ruby中使用不多,因为如果你来自另一种具有类变量的语言,它们的行为会令人惊讶。
您的用例显然要求在子类中访问类变量,因此请使用@@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()方法中,您没有设置在initialize方法之上声明的@length,@ width变量。在ruby中,@ variables将自己附加到@variables创建时self
的任何对象。以下是您的代码的详细信息:
class Rectangle < Shape
#self=Rectangle class
@length
@width
def initialize ( l,w )
#self=a new instance of the Rectangle class created by initialize
@length = l
@width = w
end
因此,在initialize()中创建的@variables将自己附加到新实例,而在initialize()上面声明的@variables将自己附加到Rectangle类,这意味着它们是完全不同的变量。
答案 1 :(得分:3)
你可以使用&#34; super&#34;调用父类初始化块并定义实例变量&#34; @ var&#34;。 在这种情况下,您可以为另一个实例修改此实例变量的值。像这样:
class Shape
def initialize ()
@var = "woohoo"
end
end
class Rectangle < Shape
def initialize(l, w)
@length = l
@width = w
super()
end
def area()
print @var
return @length * @width
end
def var=(new_value)
@var = new_value
end
end
a = Rectangle.new(1,1)
a.area
# => woohoo1
a.var = "kaboom"
a.area
# => kaboom1
b = Rectangle.new(2,2)
b.area
# => woohoo4
或者你可以使用attr_accessor
class Shape
def initialize
@var = "woohoo"
end
end
class Rectangle < Shape
attr_accessor :var
def initialize(l, w)
@length, @width = l, w
super()
end
def area()
print @var
return @length * @width
end
end
a = Rectangle.new(1,1)
a.area
# => woohoo1
a.var = "kaboom"
a.area
# => kaboom1
b = Rectangle.new(2,2)
b.area
# => woohoo4