gpt4 book ai didi

ruby-on-rails - 我应该在 NilClass 中包含 Enumerable 吗?

转载 作者:数据小太阳 更新时间:2023-10-29 07:46:06 24 4
gpt4 key购买 nike

在我使用过的 Rails 应用程序中非常常见的错误之一是 nil 类错误。具体来说,我经常看到类似“NoMethodError: undefined method ‘each’ for nil:NilClass”这样的错误。

这些很烦人,通常是良性的,并且到处都是可怕的 nil 检查代码。

这是一个例子:

[3] pry(main)> def test(enum)
[3] pry(main)* enum.each { |x| puts x }
[3] pry(main)* end
=> nil
[4] pry(main)> test(nil)
NoMethodError: undefined method `each' for nil:NilClass
from (pry):2:in `test'
[5] pry(main)>

如果我只放一个 return unless enum 或 return unless responds_to?(:each) 就很容易修复。但是,如果我不希望这些检查混淆我的代码怎么办?

好吧,我想到了一个主意,我想知道这是否是个坏主意。

[5] pry(main)> class NilClass
[5] pry(main)* include Enumerable
[5] pry(main)*
[5] pry(main)* def each; end
[5] pry(main)* end
=> nil
[6] pry(main)> test(nil)
=> nil
[7] pry(main)>

我无法想象任何库都依赖于 nil 上的 NoMethodError 来驱动逻辑(如果它们这样做听起来像是我不应该使用的库)。此外,这还带来了各种好处,因为现在可以使用所有枚举方法:

[12] pry(main)> Enumerable.public_instance_methods(false).each { |method| puts "#{method.to_s.ljust(20)} => #{nil.send(method) {} }" if nil.method(method).parameters.empty? }
to_a => []
sort => []
sort_by => []
find_all => []
select => []
reject => []
collect => []
map => []
flat_map => []
collect_concat => []
partition => [[], []]
group_by => {}
all? => true
any? => false
one? => false
none? => true
min =>
max =>
minmax => [nil, nil]
min_by =>
max_by =>
minmax_by => [nil, nil]
take_while => []
drop_while => []
lazy => #<Enumerator::Lazy:0x007f84623c9d38>

所以我的问题是:

我应该这样做吗?

编辑 1

我想指出函数式语言(和 Rust)通常不实现 nil 类。我的实际意图是将 Nil 变成一个空集,以便对 nil 的操作表现得像一个空集。

最佳答案

Specifically, I frequently see errors like "NoMethodError: undefined method `each' for nil:NilClass".

[...]

Simple to fix if I just put a return unless enum, or return unless responds_to?(:each).

[...]

Should I do this?

绝对不是。如果该错误经常发生,则意味着您的代码测试不当且开发不当。

频繁出现 NoMethodError 这意味着您未能正确处理您在输入中收到的数据,应该被视为您需要修复的错误,而不是沉默

解决方案是开始隔离每段崩溃的代码。编写一个重现错误的测试并相应地处理输入。如果您期望一个值并且传递了一个 nil,那么您需要了解为什么那里有一个 nil,修复您的代码并确保使用测试来避免回归。

关于ruby-on-rails - 我应该在 NilClass 中包含 Enumerable 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34601157/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com