1
class Polygon
  attr_accessor :sides
  @sides = 10
end

当我尝试访问

puts Polygon.new.sides # => nil

我得到零。如何访问边?这里有什么问题?

4

4 回答 4

4

由于 ruby​​ 类定义只是可执行代码,所以当您@sides = 10在类定义的上下文中说时,您是在定义它Polygon(而不是 Polygon 的实例):

class Polygon
  attr_accessor :sides
  @sides = 10
end

Polygon.instance_variables
# => [:@sides]

您可能希望从初始化程序设置 Polygon实例的边数:

class Polygon
  attr_accessor :sides

  def initialize(sides)
    @sides = sides
  end
end 

Polygon.new(10).sides
# => 10
于 2012-10-30T18:24:52.173 回答
1

你需要:

def initialize
  @sides = 10
end

通过@sides在类级别赋值,您创建了一个类实例变量,而不是您使用创建的对象的实例变量#new

在这种情况下,您有一个给定的属性,Polygon,但如果它实际上是类的属性(如作者版权或其他东西),那么如果您在使用创建的类方法@whatever中,则可以通过语法引用它。def self.something ... end

于 2012-10-30T18:24:47.997 回答
1

attr_accessor,简而言之定义了两种方法。

def sides
end

def sides=
end

要获得此处提到的边的值,您需要将它们初始化为

def initialize
  @sides = 10
end
于 2012-10-30T18:25:48.150 回答
1

这个确切的问题(甚至使用您拥有的相同示例代码)在railstips.org上得到了回答。

于 2012-10-30T18:25:57.443 回答