Вопрос о наследовании в Ruby - PullRequest
0 голосов
/ 20 октября 2010

В последнее время я пытался научить себя Руби, и я пытался заставить что-то вроде следующего работать, но я получаю следующую ошибку ...

file.rb:44:in func ': неопределенная локальная переменная или метод number' #<classname:0xb75d7840 @array=[]> (NameError)

Код, который дает мне эту ошибку ...

 class A
     def func
          file = File.new("file", "r") 
      file.each_line {|line| @numbers << line.chomp.to_i}
          @number = @array[0]
     end
 end

 class B < A
     def func
       super number
       puts number
     end
 end

Может кто-нибудь сказать мне, что я делаю не так?

edit // Просто пояснение, что я хочу, чтобы число в классе B наследовало значение @number в классе A.

Ответы [ 3 ]

4 голосов
/ 20 октября 2010

Вы забыли символ '@' для ссылки на переменную уровня экземпляра.

В любом случае, это действительно плохой дизайн. Что делать, если в файле нет строк? @numbers никогда не инициализируется. Вы также полностью удаляете @number на следующей строке с переменной (@array), которая никогда не была определена. Перестаньте пытаться разместить все как можно меньше строк и правильно инициализируйте переменные.

РЕДАКТИРОВАТЬ: Кроме того, как заметил Чак, вы передаете аргумент методу, который не принимает аргументов.

4 голосов
/ 20 октября 2010

Так же, как он говорит вам, вы звоните super и puts с аргументом number - но этот number (каким бы он ни был) нигде не определен. Определите number как нечто значимое, и код будет почти работать. Почти.

Другая ошибка, которую вы обнаружите после исправления этой ошибки, заключается в том, что вы вызываете super number, который вызывает метод A func с этим таинственным объектом number в аргумент - но A#func не принимает никаких аргументов.

0 голосов
/ 20 октября 2010

Ваша проблема в том, что, пока вы используете переменную экземпляра @number, вызываете super number (это не то, что вам нужно, так как это вызывает версию суперкласса любого метода, в котором вы находитесь, передавая number как аргумент) и puts number найдите метод number. Если вы действительно хотите просто посмотреть переменную экземпляра, вам просто нужно @number; если вы хотите определить такой метод, поместите в свой класс одну из следующих строк:

class A
  attr_accessor :number # Define reader (number) and writer (number=)
  attr_reader   :number # Define only a reader
  attr_writer   :number # Define only a writer; won't be useful here
  # ...
end

И, как сказал Эд Свангрен , вы должны очистить A: инициализировать переменные в initialize, убедиться, что вы определили все перед использованием и т. Д.

Редактировать 1: Исправлено описание поведения super.

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