Ruby Beginner Class Question - PullRequest
       1

Ruby Beginner Class Question

0 голосов
/ 02 мая 2011

Я пытаюсь изучить рубин более подробно, прежде чем перейти к разработке rails, но у меня возникли некоторые проблемы при изучении классов.Я не могу понять, почему следующее не работает.

#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, который, как я предполагаю, ссылается на @ point.append.

Ответы [ 4 ]

5 голосов
/ 02 мая 2011

Сначала попробуйте это:

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

Вы получаете ошибку NilClass, потому что переменной экземпляра @points является Nil, и NilClass, у которого нет метода append ().

1 голос
/ 03 мая 2011

Если у вас есть предупреждения (ruby -w или $VERBOSE = true), он предупредит вас, что @points не существует.

См. Некоторые другие советы по отладке в Как мнеотладка скриптов на Ruby?

1 голос
/ 02 мая 2011

Лучше, чем создать массив и заполнить его в цикле, было бы инициализировать его следующим образом:

class Shape
  attr_accessor :points

  def initialize *the_points
    @points = the_points.map{ |p| Point.new(p) }
  end
end
0 голосов
/ 02 мая 2011

Вам нужно инициализировать @points, чтобы быть новым массивом.Это начинается как ноль.

  def initialize *the_points
    @points = [];
    for p in the_points
      @points.append Point.new(p)
    end
  end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...