在这个小类中什么时候@sides=10
执行语句?
该语句与initialize
方法有何关系?
class Poligon
attr_accessor :sides
@sides=10
end
我主要习惯于 Java,其中通常对属性进行内联初始化。我现在正试图了解 Ruby 的完整初始化过程,但我找不到它。
在这个小类中什么时候@sides=10
执行语句?
该语句与initialize
方法有何关系?
class Poligon
attr_accessor :sides
@sides=10
end
我主要习惯于 Java,其中通常对属性进行内联初始化。我现在正试图了解 Ruby 的完整初始化过程,但我找不到它。
您需要将它@sides=10
放在一个方法中,并使用您当前的类定义。
class Poligon
attr_accessor :sides
def line
@sides=10
end
end
p = Poligon.new
p.line
puts p.sides
# >> 10
初始化方法是类的构造函数。如果需要,可以在构造函数中初始化实例变量:
class Poligon
attr_accessor :sides
def initialize(num_sides)
@sides = num_sides
end
end
但由于@sides
被声明为attr_accessor
,您可以直接设置/获取它:
p = Poligon.new
p.sides = 10
简短的答案:
语句@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"
有关类实例变量以及它们如何与类变量相关的更多信息,您可以阅读Martin Fowler 的这篇文章。