我正在学习Ruby,最近完成了一项创建目录的任务。但是,代码可以在代码结束时发生以下错误:
table_of_contents2.rb:23:in `<main>': undefined method `ljust' for nil:NilClass (NoMethodError)
我通过在while循环中执行nil
来仔细检查大纲变量不是puts outline
,并尝试将outline
变量更改为@outline
和{整个代码{1}},但错误仍然存在。
完整代码如下:
$outline
为什么会出现此错误?为什么在代码成功运行后会发生这种情况?
附录:我在终端中运行代码。运行代码时终端内的完整显示如下:
lineWidth = 40
chapters = ["Chapter 1: Numbers", "Chapter 2: Letters",
"Chapter 3: Variables"]
pages = ["page 1","page 72","page 118"]
puts "Table of Contents".center lineWidth
outline = []
i = 0
while i < 3
outline.push(chapters[i])
outline.push(pages[i])
i = i + 1
end
j = 0
while j <= outline.length
puts outline[j].ljust(lineWidth/2) +
outline[j+1].rjust(lineWidth/2)
j = j + 2
end
提前感谢您的帮助!
答案 0 :(得分:5)
问题出在while j <= outline.length
行。
应为while j < outline.length
。
但是,在Ruby中,手动维护游标通常被认为是一种不好的做法。您的程序可以重写为
line_width = 40
chapters = ["Chapter 1: Numbers", "Chapter 2: Letters",
"Chapter 3: Variables"]
pages = ["page 1","page 72","page 118"]
puts "Table of Contents".center line_width
chapters.zip(pages).each do |chapter, page|
puts chapter.ljust(line_width/2) + page.rjust(line_width/2)
end
顺便说一句,Ruby程序员更喜欢使用下划线来表示camelcase(类名和模块名除外),因此我将lineWidth
更改为line_width
。
答案 1 :(得分:1)
您正在尝试访问outline[outline.length]
,这就是它返回nil
的原因。 (Ruby中的数组索引介于0
和length - 1
)
更改此行:
while j <= outline.length
这一个:
while j < outline.length
答案 2 :(得分:0)
编程语言从0开始索引,但数值(如数组的长度)只是正常使用。
因此,当询问它有多长(.length
)时,数组将返回5个项目,但数组中最大的索引是4。
在你的情况下,你起床直到数组中的最后一项(<=
),然后尝试访问一个大于存在的索引(你在询问是否有增量器)更小)。
将<=
更改为<
,以便当增量器等于数组的大小时,它也不会这样做:
while j < outline.length
那就是它。
0索引,真正简单,但在考虑如何迭代数据时很快就会变得混乱。
Ruby有一些更方便的函数可以为你抽象。见.each
:
collection.each do |i, element|
puts i
puts element
end