Ruby初学者课题

时间:2011-05-02 17:19:46

标签: ruby class

在我开始使用rails dev之前,我正在尝试更深入地学习ruby,但是我在学习课程时遇到了一些问题。我似乎无法理解为什么以下不起作用。

#point.rb
class Point
  attr_accessor :x, :y

  def initialize(p = [0,0])
   @x = p[0]
   @y = p[1]
  end
end

#shape.rb
require_relative 'point.rb'

class Shape

  attr_accessor :points

  def initialize *the_points
    for p in the_points
      @points.append Point.new(p)
    end
  end

end

s = Shape.new([3,2])

puts s.points

当我调用该函数时,我得到NilClass的no方法错误,我假设它是指@ point.append。

4 个答案:

答案 0 :(得分:5)

首先,试试这个:

def initialize *the_points
  @points = []
  for p in the_points
    @points << Point.new(p)
  end
end

你得到NilClass错误,因为@points实例变量是Nil,而NilClass没有append()方法。

答案 1 :(得分:1)

比创建一个数组并在循环中填充它更好,就像这样初始化它:

class Shape
  attr_accessor :points

  def initialize *the_points
    @points = the_points.map{ |p| Point.new(p) }
  end
end

答案 2 :(得分:1)

如果您(ruby -w$VERBOSE = true)发出警告,则会警告您@points不存在。

请参阅How do I debug Ruby scripts?

中的其他一些调试提示

答案 3 :(得分:0)

您需要将@points初始化为新数组。它从零开始。

  def initialize *the_points
    @points = [];
    for p in the_points
      @points.append Point.new(p)
    end
  end