【问题标题】:Ruby programming why is While loop generating a (NoMethodError)?Ruby 编程为什么 While 循环会生成 (NoMethodError)?
【发布时间】:2016-03-02 01:05:52
【问题描述】:

我是一个相对较新的 Ruby 学生,虽然我可以说它永远不会成为我更喜欢的语言,但我至少想了解它,因为它是一种网关语言。对于我的项目,我们被指示解决传递到多维数组中的迷宫。我们还没有学习递归或任何高级技术。这是一个概述。 我的代码中的具体问题是,在我的 while 循环中,我收到了我要传递到数组中的值的错误消息。

rb:60 in `: nil:NilClass 的未定义方法 `[]' (NoMethodError) 来自 -e:1:in `load'

我做了一个小时左右的研究,这意味着我传递给我的数组的值是 nil,但我已经为它分配了一个值。 我的代码如下。我已经将它隔离到导致它抛出错误的row 变量,但我已经为row 分配了一个值,并且可以通过。当我使用row+=1 时,它会抛出我认为的错误。 (虽然我可能是不正确的。)我也在向我的老师询问这个问题,但他没有回复,所以我想我也会在这里发布它,希望能找到错误的解决方案。

maze=[]

def main_menu (options)
options.each_with_index do |option, index|

printf("%-s. %-s\n", "#{index+1}", "#{option}")
end
print "Please make a selection:"
main_selection=gets.to_i
return main_selection
end

menu_selection=["Maze 1", "Maze 2", "Maze 3", "Maze 4", "Maze 5", "Maze 6", "Maze 7", "Maze 8", "Maze 9", "Maze 10", "Quit"]
user_selection=0
path=1
row=0
column=0
while user_selection != menu_selection.length
user_selection=main_menu(menu_selection)
puts user_selection
case user_selection
when 1
  maze.clear
  mz_file=File.open("maze1.mz")

  while !mz_file.eof?
    line=mz_file.gets.chomp.split("")
    maze.push line
  end
  mz_file.close
  maze.each do |row|
    puts row.join
  end

  maze.each_index do |row|
    column = maze[row].index "F"
    if column
      maze[row+1][column]=0
      maze[row-1][column]=0
      maze[row][column+1]=0
      maze[row][column-1]=0
    end
  end
  maze.each do |row|
    puts row.join
  end

  #WHILE LOOP FOR MAZE

  while row <=maze[0].length
    column=0
    while column <= maze.length
      if maze[row][column]== 0
        maze[row+1][column]==path
        maze[row-1][column]==path
        maze[row][column+1]==path
        maze[row][column-1]==path
      end
      column=column+1
    end
    row=row+1
  end
  maze.each do |row|
    puts row.join
  end
when 2
  maze.clear
  mz_file=File.open("maze2.mz")
  while !mz_file.eof?
    line=mz_file.gets.chomp.split("")
    maze.push line
  end
  maze.each do |row|
    puts row.join
  end
  mz_file.close
when 3
  maze.clear
  mz_file=File.open("maze3.mz")
  while !mz_file.eof?
    line=mz_file.gets.chomp.split("")
    maze.push line
  end
  maze.each do |row|
    puts row.join
  end
  mz_file.close
when 4
  maze.clear
  mz_file=File.open("maze4.mz")
  while !mz_file.eof?
    line=mz_file.gets.chomp.split("")
    maze.push line
  end
  maze.each do |row|
    puts row.join
  end
  mz_file.close
when 5
  maze.clear
  mz_file=File.open("maze5.mz")
  while !mz_file.eof?
    line=mz_file.gets.chomp.split("")
    maze.push line
  end
  maze.each do |row|
    puts row.join
  end
  mz_file.close
when 6
  maze.clear
  mz_file=File.open("maze6.mz")
  while !mz_file.eof?
    line=mz_file.gets.chomp.split("")
    maze.push line
  end
  maze.each do |row|
    puts row.join
  end
  mz_file.close
when 7
  maze.clear
  mz_file=File.open("maze7.mz")
  while !mz_file.eof?
    line=mz_file.gets.chomp.split("")
    maze.push line
  end
  maze.each do |row|
    puts row.join
  end
  mz_file.close
when 8
  maze.clear
  mz_file=File.open("maze8.mz")
  while !mz_file.eof?
    line=mz_file.gets.chomp.split("")
    maze.push line
  end
  maze.each do |row|
    puts row.join
  end
  mz_file.close
when 9
  maze.clear
  mz_file=File.open("maze9.mz")
  while !mz_file.eof?
    line=mz_file.gets.chomp.split("")
    maze.push line
  end
  maze.each do |row|
    puts row.join
  end
  mz_file.close
when 10
  maze.clear
  mz_file=File.open("maze10.mz")
  while !mz_file.eof?
    line=mz_file.gets.chomp.split("")
    maze.push line
  end
  maze.each do |row|
    puts row.join
  end
  mz_file.close
 end
end

【问题讨论】:

    标签: arrays ruby while-loop nomethoderror


    【解决方案1】:

    你这里有很多问题。您的缩进都是错误的,这将帮助您追踪一些问题,例如未闭合的循环/块(这是您发布的代码中的问题)。您正在使用循环索引多次隐藏您的 row 变量,在检查字符串响应之前您未能去除空格(几乎可以肯定将一些 nils 放入您的数组中),您正在使用 ==似乎在您的程序中分配了大约 50 行,您正在使用 &lt;= 来测试数组索引与长度的关系。

    尝试在irb 中测试您的小任务,例如读取一行输入并将其拆分。如果您开展业务的方式存在问题,这将为您提供直接和即时的反馈。您还应该考虑使用可以帮助您缩进的编辑器或 IDE,并对您似乎想要分配的 == 等内容进行一些完整性检查。

    【讨论】:

      猜你喜欢
      • 2012-11-07
      • 2016-04-21
      • 2016-05-26
      • 1970-01-01
      • 1970-01-01
      • 2021-04-14
      • 2012-10-11
      相关资源
      最近更新 更多