关于Ruby中继承的问题

时间:2010-10-19 23:04:06

标签: ruby inheritance

过去我一直在尝试自学Ruby,而且我一直试图让以下内容起作用,但是我收到了以下错误......

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

有人可以告诉我我做错了吗?

编辑//只是澄清我希望课程B中的数字继承课程@numberA的值。

3 个答案:

答案 0 :(得分:4)

就像它告诉你的那样,你正在使用super参数调用putsnumber - 但这个number(无论它应该是什么)都没有'已在任何地方定义。将number定义为有意义的内容,代码几乎可以正常工作。 几乎。

你修复那个错误后会发现的另一个错误就是你正在调用super number,这个问题用A func方法调用<{1}}对象作为参数 - 但number不接受任何参数。

答案 1 :(得分:4)

您忘记了'@'符号来引用实例级变量。

无论如何,这是一个非常糟糕的设计。如果'file'中没有行怎么办?永远不会初始化@numbers。你还使用一个从未定义的变量(@array)在下一行完全消灭@number。停止尝试将所有内容放在尽可能少的行中并正确初始化变量。

编辑:另外,正如Chuck注意到的那样,你正在将一个参数传递给一个不带参数的方法。

答案 2 :(得分:0)

你的问题是当你使用实例变量@number时,调用super number(这不是你想要的,因为这会调用你所使用的任何方法的超类版本,传递{ {1}}作为参数)和number查找方法 puts number。如果你真的想查找实例变量,你只需要number;如果要定义此类方法,请在类中添加以下行之一:

@number

正如Ed Swangren所说,你应该清理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中的变量,确保在使用之前定义所有内容等等。

编辑1:更正了initialize行为的说明。