Ruby字段初始化

时间:2013-09-26 10:48:57

标签: ruby attributes initialization

执行@sides=10语句时,在这个小类中? 该陈述与initialize方法有何关联?

class Poligon
    attr_accessor :sides
    @sides=10
end

我主要习惯于Java,它通常对属性进行内联初始化。我现在正在尝试理解Ruby的完整初始化过程,但我无法找到它。

3 个答案:

答案 0 :(得分:3)

您需要将此@sides=10放在方法中,并使用当前的类定义。

class Poligon
    attr_accessor :sides
    def line
     @sides=10
    end
end

p = Poligon.new
p.line
puts p.sides
# >> 10

答案 1 :(得分:3)

initialize方法是类的构造函数。如果需要,可以在构造函数中初始化实例变量:

class Poligon
    attr_accessor :sides

    def initialize(num_sides)
      @sides = num_sides
    end
end

但由于@sides被声明为attr_accessor,您可以直接设置/获取它:

p = Poligon.new
p.sides = 10

答案 2 :(得分:3)

简答:

  • 当评估中的@sides = 0表达式时,状态员class(实际为is an expression)被执行。

  • initialize方法完全无关。

在编写时,@sides变量是类实例变量,即Poligon对象的实例变量(请记住在Ruby类中是类Class)的对象。您必须在方法定义中初始化实例变量(可能在initialize方法内)。考虑这个例子:

class Poligon
  @class_sides = 'class instance variable'
  def initialize
    @instance_sides = 'instance variable'
  end
end

Poligon.instance_variables
# => [:@class_sides]

Poligon.instance_variable_get(:@class_sides)
# => "class instance variable" 

Poligon.new.instance_variables
# => [:@instance_sides] 

Poligon.new.instance_variable_get(:@instance_sides)
# => "instance variable"

有关类实例变量的更多信息以及它们与类变量的关系,您可以阅读this article by Martin Fowler