不确定为什么Ruby中的while循环会更改参数

时间:2019-02-09 17:36:59

标签: ruby

Ruby的

非常(非常非常),因此对这个糟糕的代码表示歉意。

我有以下2d数组;

test = [
  ['Z','M','Z','Z','Z'],
  ['Z','Z','M','M','Z'],
  ['Z','Z','M','Z','Z'],
  ['Z','Z','Z','Z','Z'],
  ['Z','M','Z','Z','M']
]

,我想返回数组中每个单元的相邻单元(最多8个)。我正在逐行尝试此操作,使用“ while”循环遍历每个子数组,直到遇到超出范围的索引。

我确定这是非常低效,愚蠢的,但是现在这就是我的头了!

当我按照下面的方法调用方法时,传递参数(test,0,4),它沿'x'索引正确地工作,但是我对为什么我的'y'参数感到困惑在第一个循环后从“ 4”变为“ 1”。

我想念什么?

def do_the_cells_in_one_row grid,x=0,y=0
  while grid[y][x].nil? == false
    puts "here's x: #{x} y: #{y}"
    puts grid[y][x]

    if (x-1).negative? == false
      print grid[y][x-1] 
      print y
      puts x-1
    end

    if (x-1).negative? == false && (y-1).negative? ==false
      print grid[y-1][x-1]
      print y-1
      puts x
    end

    if (y+1) < grid.length && (x-1).negative? == false
      print grid[y+1][x-1]
      print y+1 
      puts x-1
    end

    if (y+1) < grid.length
      print grid[y+1][x]
      print y+1
      puts x
    end

    if (y-1).negative? == false
      print grid[y-1][x]
      print y-1
      puts x
    end

    if  x+1 < grid[y].length
      print grid[y][x+1]
      print y
      puts x+1
    end

    if  y+1 < grid.length && x+1 < grid[y].length
      print grid[y+1][x+1]
      print y+1
      puts x+1
    end

    if (y-1).negative? == false && (x+1) < grid[y].length
      print grid[y-1][x+1]
      print y-1
      puts x+1
    end

    x += 1
  end
end

do_the_cells_in_one_row(test,0,4)

EDIT 根据评论更新了代码!不幸的是,直接遇到另一个问题。我正在尝试通过每个子数组循环代码;

def do_every_row grid,x=0,y=0
  while grid[y][x].nil? == false
    do_the_cells_in_one_row(grid,x,y)
    y += 1
  end
end

出现以下错误

in `do_every_row': undefined method `[]' for nil:NilClass (NoMethodError)

但不确定为什么!

1 个答案:

答案 0 :(得分:0)

在上一次迭代中,当Ruby尝试计算表达式grid[y][x].nil? == false时,y超出边界y = 5。当Ruby移至下一个串联方法时,由于grid[y] = nil会引发错误,因此前一个表达式将解释为nil[x].nil? == false

在Ruby中,方法是在每个类中定义的,因此会发生错误,因为您尝试将Array类方法[]与Nil对象一起使用(该对象是NilClass的实例,并且没有方法)。

一个简单的解决方案是将y与数组长度进行比较。在这种情况下,while y < grid.length