我正在学习Ruby的同时第一次编写基础库,并且遇到了一个小障碍。
处理返回迭代的方法的返回值的Ruby-esque方法是什么?一个方法应该返回一个空的hash / array /或Nil吗?
我正在努力让我的图书馆的潜在用户牢记他们如何在他们的代码中处理这两种情况。
编辑:我想我想返回一个空对象,因为如果他们用.each迭代返回值,例如,它至少会完成并且不会在NilClass上出现NoMethodError。
答案 0 :(得分:4)
不仅在ruby中,而且在其他语言中,您应该返回一个空的枚举/集合。在执行任何操作之前,您的用户无需检查返回值是否为零,这是浪费时间。
答案 1 :(得分:2)
我认为你没有问正确的问题。看看Ruby的内置方法。许多人返回一个可能为空的集合,但在某些情况下还需要返回其他内容。其他东西通常是nil
,但并非总是如此。
首先,如果对接收者进行了更改,则有许多“bang”方法返回(可能为空)集合,但在未进行更改时返回nil
。示例包括Array#compact!
,Array#flatten!
,Array#reject!
,Array#select!
,Array#uniq!
,Hash#reject!
和Hash#select!
。
当无法执行操作时,某些其他方法会返回(可能为空)集合或nil
。例如,如果第一个索引超出范围,则Array#slice
和Array#slice!
会返回nil
;如果可以,Hash::try_convert
将对象转换为(可能是空的)哈希,如果不能,则返回nil
。
与nil
相比,它不仅仅是一个空集合。一些Ruby方法返回集合或nil
以外的其他东西。这包括许多很多方法,它们在传递一个块时返回一个集合,但如果没有块则返回一个枚举器(允许枚举器链接)。
我的建议是不要试图决定它是永远是空集合还是nil
。阅读Ruby内置方法的文档,了解一些非常聪明且经验丰富的Rubyist所做的事情,然后根据具体的指导原则逐案处理。