Ruby未定义方法/命名方法错误'*';对于nil:NilClass,工作直到循环

Ruby未定义方法/命名方法错误'*';对于nil:NilClass,工作直到循环,ruby,Ruby,我的程序对数组1和数组2进行排序,并迭代检查1中的每个元素是否是2中每个元素的sqrt。我已经在没有循环的情况下测试了比较,结果很好,所以我不认为存在未初始化的变量 def comp(array1, array2) order1 = array1.sort order2 = array2.sort i = 0 while i < order1.length if order1[i] * order1[i] == order2[i] i += 1

我的程序对数组1和数组2进行排序,并迭代检查1中的每个元素是否是2中每个元素的sqrt。我已经在没有循环的情况下测试了比较,结果很好,所以我不认为存在未初始化的变量

def comp(array1, array2)
  order1 = array1.sort
  order2 = array2.sort

  i = 0

  while i < order1.length
    if order1[i] * order1[i] == order2[i]
      i += 1
    else
      false
    end
  end

  order1[i] * order1[i] == order2[i]

end
def comp(阵列1、阵列2)
order1=array1.sort
order2=array2.sort
i=0
而我的长度小于1.5米
如果order1[i]*order1[i]==order2[i]
i+=1
其他的
假的
结束
结束
订单1[i]*订单1[i]==订单2[i]
结束

你能给我指出问题的方向吗?我也没有使用Math.sqrt,因为它在我的界面上超时。

您的
I
等于
order1.length
,在循环之后,因此方法的最后一行基本上是

order1[order1.length] * order1[order1.length] == order2[order1.length]
即(假设数组长度相同):

这会抛出一个错误。不确定为什么需要最后一行,如果删除它并仅返回一个计数器,则如果对符合条件的元素使用专用计数器,而不是使用索引(索引必须始终递增),则方法将按预期工作:

作为最后一步,我们还可以确定数组中有多少元素满足某个条件,而无需指定局部变量,如下所示:

def comp(array1, array2)
  order2 = array2.sort
  array1.sort.each_with_index.count { |el, i| el ** 2 == order2[i] }
end

非常感谢,这是彻底的,我会调查统计员。程序正在运行,但我现在得到了“in
comp”:nil:NilClass(NoMethodError)的未定义方法,有什么想法吗?你似乎在把
nil
而不是实际的数组传递给你的方法。如果你想知道排序后的
array1
的每个元素的平方是否等于排序后的
array2
在相同索引位置的元素,你可以写
array1.sort.zip(array2.sort)。好吗?{| n1,n2 | n1*n1==n2}
def comp(array1, array2)
  order1 = array1.sort
  order2 = array2.sort

  i = 0
  counter = 0

  while i < order1.length
    if order1[i] * order1[i] == order2[i]
      counter += 1
    end

    i += 1
  end

  counter
end
def comp(array1, array2)
  order1 = array1.sort
  order2 = array2.sort

  counter = 0

  order1.each_with_index do |el, i|
    if el * el == order2[i]
      counter += 1
    end
  end

  counter
end
def comp(array1, array2)
  order2 = array2.sort
  array1.sort.each_with_index.count { |el, i| el ** 2 == order2[i] }
end