2013-09-26 51 views
0

在这个微小的类中执行@sides=10语句时?
该声明如何与initialize方法相关?Ruby字段初始化

class Poligon 
    attr_accessor :sides 
    @sides=10 
end 

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

+1

在此博客中找到有关此主题的信息:http://www.railstips.org/blog/archives/2006/11/18/class-and-instance-variables-in-ruby/ – hirolau

回答

3

简短回答:

  • 政治家@sides = 0(实际上)是执行时class表达式在评估中。

  • 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

+0

惊人的解释,谢谢 – mottalrd

3

您需要将此@sides=10放入一个方法中,以及您当前的类定义。

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

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

没错。否则,你设置'Poligon'对象的实例变量。 –

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