【发布时间】:2018-03-17 15:43:45
【问题描述】:
我是来自 Java 背景的 Ruby 新手。显然,我还不了解实例方法和变量之间的关系。我只是有一些这样的代码:
class Problem022
FILENAME = "resources/p022_names.txt"
@name_array = [] # <--- class line 3
def do_problem
read_input()
sort_input()
# do more stuff
end
def read_input
# <--- read_input line 2
File.open(FILENAME, "r") do |file|
file.each_line do |line|
scanner = StringScanner.new(line)
while scanner.exist?(/,/) do
name = scanner.scan_until(/,/)
@name_array.push(name) # <--- marked line
end
# more logic
end
def sort_input()
@name_array.sort!
end
# other methods
end
puts problem = Problem022.new.do_problem()
我确认这在“标记线”之前工作正常(见上面的评论),但在那一行,我得到了错误
在 read_input 中的“块(2 级)”中:未定义方法“push”用于 nil:NilClass (NoMethodError)
我能够通过(有点盲目地)添加该行来解决它
@name_array = []
在“read_input line 2”,但我不明白为什么会这样。为什么方法不能识别类体中实例变量@name_array的声明?似乎可以使用常量FILENAME 就好了,而且基本上是在同一个地方定义的。方法和变量都是实例,而不是类,所以我不希望那里有任何问题。我刚刚意识到,即使“class line 3”上的声明被注释掉,程序仍然可以正常运行,这只会让我更加困惑。
我已经阅读了 Ruby 中的多个范围定义,但没有一个为我解决了这个问题。我误会了什么?
【问题讨论】:
-
是的,它被问过无数次了。让我给你找一个很好的副本。
-
我想,但我的搜索技能达不到它。我看过一些帖子,但它们对我没有帮助。
-
这里,这个应该够近了:stackoverflow.com/questions/25025235/…
-
看一看。如果好,我会以重复的形式关闭问题
-
看起来像一个类似的主题,但我看不出它如何回答我关于为什么根本无法识别初始声明的问题......?