我正在学习Ruby,最近完成了一项创建目录的任务但是,在代码结束时,会发生以下错误:
table_of_contents2.rb:23:in `<main>': undefined method `ljust' for nil:NilClass (NoMethodError)
我通过在while循环中执行
nil
来再次检查outline变量是否puts outline
,并尝试在整个代码中将outline
变量更改为@outline
和$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
为什么会发生这个错误为什么在代码成功运行之后会发生这种情况?
补遗:我在终端运行代码当我运行代码时,终端内的完整显示如下:
$ ruby table_of_contents2.rb
Table of Contents
Chapter 1: Numbers page 1
Chapter 2: Letters page 72
Chapter 3: Variables page 118
table_of_contents2.rb:23:in `<main>': undefined method `ljust' for nil:NilClass (NoMethodError)
提前谢谢你的帮助!
最佳答案
编程语言在0开始索引,但是数字值(如数组的长度)只是正常使用。
因此,当被问及数组的长度(.length
)时,数组将返回5个项,但数组中最大的索引是4。
在你的情况下,你一直到数组中的最后一个项目(<=
),然后尝试访问一个大于现有的索引(你问增量器是否更小)。
将<=
更改为<
,这样当incrementor等于数组大小时也不会这样做:while j < outline.length
就这样。
0索引,简单但非常快,当思考如何迭代数据时会变得混乱。
Ruby有一些更方便的函数来为您抽象这个参见:
collection.each do |i, element|
puts i
puts element
end
关于ruby - nil:NilClass的未定义方法“恰好”(NoMethodError),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44793008/