ruby-on-rails - 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
解决方案
因此,我阅读了 Kata 的描述并考虑将其发布在评论中,但我想为什么不提供一点帮助。
在描述中它指出:
a 或 b 可能为 nil 或 null 或 None 或无(C++、Elixir、Haskell、PureScript、Pascal、R、Rust、Shell 除外)。
如果 a 或 b 为 nil(或 null 或 None),则问题没有意义,因此返回 false。
所以你现在的问题是那b
是nil
错误,因为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
是真实的。在红宝石中,除了nil
and之外,一切都是真实的false
。
通常我会这样写,return unless array1 && array2
但 Kata 明确表示返回false
话虽如此,我们可以进一步清理您的代码。我们先来看看这部分d == [] ? true : false
。d == []
将返回一个布尔值 ( 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
可以进行一些额外的重构,但这应该会让你朝着正确的方向前进。
推荐阅读
- json - 有没有一种方法可以使用 JSON SCHEMA 按值声明属性的依赖关系?
- javascript - 将括号内的文本转换为大写
- java - FifoBuffer - apache 常用集合 4 个替换
- node.js - 使用节点js在Web中支付成功后重定向回应用程序问题
- reactjs - JSX 元素没有任何构造或调用签名
- javascript - 如何从 Web 应用程序中的文本字段向 Google 表格添加新值,然后自动更新关联的下拉列表?
- c++ - 使用 UDP 的写入和读取之间的长时间延迟
- rxjs - 无论顺序如何,RxJS 测试两个流的相等性
- sql - 刷新文本编辑器 SQL Server Management Studio v17.9
- tcl - Tcl 中的 regsub 用空字符串替换模式