从子类访问实例变量
我正在尝试从子类访问父类的数据库。 我不知道怎么称呼它。 我发现了很多关于访问类变量的信息,但没有找到子类中的实例变量。 这是我的代码:
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,以及其他一些我希望从其他语言中获得的组合。 在子类的实例中打印(如果可能的话)变量的正确方法是什么?
编辑:我希望子类的各个实例用他们自己的唯一字符串替换’woohoo’字符串。
谢谢!
您可以使用“super”调用父类初始化块并定义实例变量“@var”。 在这种情况下,您可以为另一个实例修改此实例变量的值。 像这样:
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
我正在尝试从子类访问父类的数据库。 我不知道怎么称呼它。 我发现了很多关于访问类变量的信息,但没有找到子类中的实例变量。 这是我的代码:
class Shape @var = "woohoo"
该变量称为类实例变量 ,人们使用类实例变量而不是类变量 (即@@variable
)的原因正是因为子类无法访问它。 因为类实例变量是类变量在其他语言中工作的方式,所以@@variables
在ruby中的用处不多,因为如果你来自另一种具有类变量的语言,它们的行为会令人惊讶。
您的用例显然要求在子类中访问类变量,因此请使用@@variable
。
编辑:我希望子类的各个实例用他们自己的唯一字符串替换’woohoo’字符串。
您可以使用类实例变量 :
class Shape @var = "shapehoo" class <
与常规实例变量一样, 类实例变量是私有的,因此如果要访问它们,则必须提供访问器方法。 访问器需要在类的单例类中,您可以使用以下语法打开它:
class <
添加:
关于此代码:
class Rectangle < Shape @length @width def initialize ( l,w ) @length = l @width = w end
在initialize()方法中,您没有设置在initialize方法之上声明的@length,@ width变量。 在ruby中,@ variables将自己附加到@variables创建时的自身对象。 以下是您的代码的更多详细信息:
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类,这意味着它们是完全不同的变量。