从子类访问实例变量

时间:2015-06-09 22:36:00

标签: ruby

我试图从子类访问父类的数据库。我不知道怎么称呼它。我发现了很多关于访问类变量的信息,但没有找到子类中的实例变量。这是我的代码:

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;字符串有自己独特的字符串。

谢谢!

2 个答案:

答案 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