在我开始使用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。
答案 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
不存在。
答案 3 :(得分:0)
您需要将@points初始化为新数组。它从零开始。
def initialize *the_points
@points = [];
for p in the_points
@points.append Point.new(p)
end
end