首页 > 解决方案 > nil:NilClass (NoMethodError) 的未定义方法 `-' | 红宝石/代码战问题

问题描述

    def comp(array1, array2)
  d = array2 - array1.map{|x| x.pow(2)}
  d == [] ? true : false
end

错误退出代码:

main.rb:4:in comp': undefined method -' for nil:NilClass (NoMethodError) from main.rb:35:in block in <main>' from /runner/frameworks/ruby/cw-2.rb:55:in block in describe' from /runner/frameworks/ruby/cw-2.rb:46:in measure' from /runner/frameworks/ruby/cw-2.rb:51:in describe' from main. rb:7:in `'

这是我在这里的第一篇文章,如果我犯了任何错误,请见谅:/

@Edit:添加了“如果”

def comp(array1, array2)
  if array1 == nil or array2 == nil
    return false
  else
    d = array2 - array1.map{|x| x.pow(2)}
    d == [] ? true : false
  end
end

标签: ruby-on-rails

解决方案


因此,我阅读了 Kata 的描述并考虑将其发布在评论中,但我想为什么不提供一点帮助。

在描述中它指出:

a 或 b 可能为 nil 或 null 或 None 或无(C++​​、Elixir、Haskell、PureScript、Pascal、R、Rust、Shell 除外)。

如果 a 或 b 为 nil(或 null 或 None),则问题没有意义,因此返回 false。

所以你现在的问题是那bnil错误,因为nil:NilClass没有-方法。

为了避免这种情况并完成 Kata,我们可以重新设计您的方法,如下所示:

def comp(array1, array2)
  return false unless array1 && array2
  d = array2 - array1.map{|x| x.pow(2)}
  d == [] ? true : false
end

该条款return false unless array1 && array2的意思是两者都array1必须array2是真实的。在红宝石中,除了niland之外,一切都是真实的false通常我会这样写,return unless array1 && array2但 Kata 明确表示返回false

话虽如此,我们可以进一步清理您的代码。我们先来看看这部分d == [] ? true : falsed == []将返回一个布尔值 ( true/ false),因此逻辑上将其放入单词中,它显示为“如果 d 等于空数组等于真则为真或如果 d 等于空数组等于假返回假”。

正如您根据阅读所见,我们可以将其缩短为“返回 d 等于空数组”或 ( d == [])。现在这有点好,但有点功能。Ruby 是一种极其面向对象的编程语言,从字面上看,一切都是对象,而在面向对象的编程中,对象具有方法。如果我们看一下Array对象,我们可以看到它有一个empty?方法,所以我们可以简单地调用d.empty?

所以现在我们的代码如下所示:

def comp(array1, array2)
  return false unless array1 && array2
  d = array2 - array1.map{|x| x.pow(2)}
  d.empty?
end

可以进行一些额外的重构,但这应该会让你朝着正确的方向前进。


推荐阅读