过去我一直在尝试自学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
中的数字继承课程@number
中A
的值。
答案 0 :(得分:4)
就像它告诉你的那样,你正在使用super
参数调用puts
和number
- 但这个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
行为的说明。