Почему я получаю "неопределенный метод" + для nil: NilClass "? - PullRequest
2 голосов
/ 21 августа 2010

не + оператор? почему бы не определить?

вот мой код:

Class Song
  @@plays = 0
  def initialize(name, artist, duration)
    @name = name
    @artist = artist
    @duration = duration
    @plays = 0
  end
  attr_reader :name, :artist, :duration,
  attr_writer :name, :aritist, :duration
  def play
    @plays += 1
    @@plays += 1
    "This Song:  #@plays play(s).  Total #@@plays plays."
  end
  def to_s
    "Song: #@name--#@artist (#@duration)"
  end
end

Ответы [ 3 ]

4 голосов
/ 21 августа 2010

Во-первых, этот код даже не запускается: class в строке 1 необходимо записать строчной буквой c, а запятая после последнего элемента в выражении (строка attr_reader) не может быть , Я не получаю NoMethodError после исправления ошибок и запуска Song.new или Song#play или Song#to_s.

В любом случае, вы всегда получите это NoMethodError, когда попытаетесь добавить что-нибудь к значению nil:

>> nil + 1
NoMethodError: undefined method `+' for nil:NilClass
    from (irb):1
>> nil + nil
NoMethodError: undefined method `+' for nil:NilClass
    from (irb):2
>> # @foo is not defined, so it will default to nil
?> @foo + 2
NoMethodError: undefined method `+' for nil:NilClass
    from (irb):4

Так что вы можете пытаться добавить что-то в неинициализированную переменную экземпляра ... или это может быть что угодно. Вам всегда нужно опубликовать полный минимальный код, чтобы дублировать ошибку, если вы хотите, чтобы вам помогли правильно.

3 голосов
/ 21 августа 2010

+ определяется по числам (между прочим). Однако, как говорится в сообщении об ошибке, оно не определено на nil. Это означает, что вы не можете сделать nil + something и с чего бы вы?

При этом фактически вы нигде не вызываете nil + something в коде, который вы показали (вы инициализируете оба значения @plays и @@plays равными 0 и не устанавливаете их в nil в любой точке). И на самом деле ваш код работает нормально после удаления двух синтаксических ошибок (Class должно быть class и после :duration не должно быть запятой). Так что ошибка не в коде, который вы показали.

0 голосов
/ 26 августа 2010

может быть, вам следует включить @@plays = 0 в ваш метод инициализации?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...