nil的未定义方法`ljust':NilClass(NoMethodError)

时间:2017-06-28 03:10:30

标签: ruby

我正在学习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

提前感谢您的帮助!

3 个答案:

答案 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中的数组索引介于0length - 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