【问题标题】:Ruby: Undefined method `length' for 1:Integer (NoMethodError)Ruby:1:整数的未定义方法“长度”(NoMethodError)
【发布时间】:2021-08-05 01:02:29
【问题描述】:
def print_array(arr)
  # YOUR WORK HERE
  i = 0
  if i > arr.length

  else
    p print_array(arr[i])
    i += 1
  end
end 

我收到此错误::4:in print_array': undefined method length' for 1:Integer (NoMethodError) 每当我尝试运行代码时。不明白问题出在哪里。

【问题讨论】:

  • 尝试在开头插入以下代码行来运行您的代码:puts "arr = #{arr}"
  • 另一种快速调试方法:p(arr: arr)

标签: ruby methods


【解决方案1】:

您实际上是在调用print_array(1),这不是一个有效的调用。

你需要的是:

print_array([ arr[i] ])

您也可以使用数组切片:

print_array(arr[i,1])

或者更改 args 使其默认为数组:

def print_array(*arr)
   # ...
end

然后您最初在没有[ ... ] 的情况下调用它。

我建议代码的固定版本如下所示:

def print_array(arr, index = 0)
  return if index > arr.length

  p arr[index]

  print_array(arr, index + 1)
end 

或者可能:

def print_array(arr)
  return unless arr.any?

  p arr[0]

  print_array(arr.drop(1))
end 

【讨论】:

  • 我最初尝试通过将其调用为``` print_array([1, 2, 3]) ``` 来测试它,但在代码到达调用之前就收到了该错误。当我将星号添加到参数时,它似乎确实有效,我只是收到系统堆栈错误,但这是我尝试练习的递归问题。仍然不明白为什么我会收到初始错误,因为#length 绝对是 Ruby 的内置方法。
  • 这是一个内置方法...用于 Array。你用整数调用它。请注意,您在不正确的 else 块中拨打电话。
猜你喜欢
  • 2017-05-30
  • 2018-05-16
  • 2023-03-06
  • 1970-01-01
  • 2022-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多