返回可选值的惯用方式是什么?

What is the idiomatic way of returning optional values?

我只是有点 运行 靠墙。 假设我的代码如下所示:

def foo
    if bar
        123
    else
        nil
    end
end

此处的 return 值为 Int 或 Nil。 我已经习惯了可选值的概念(在 Rust、F#、Haskell 等语言中),这让我很困惑。

我意识到我可以 return 任何类型的值都没有问题,但是从更函数式的背景来看,我感觉不对。

在 Rust 中,我会 return 一个 Option<T>。这样我就可以很容易地测试 Some 值是 returned,还是没有值 (None)。在 Ruby/Crystal 中,这似乎是一件愚蠢的事情。

所以,问题是:
在 return 没有有用价值的情况下,我是否应该只 return nil 并对其进行测试,这是处理此类情况的惯用方式吗?如果没有,我应该如何以惯用的方式进行?

是的,return nil

返回 nil 是 Ruby 中鼓励的最佳实践。您可以使用 foo.nil?

检查

注意,如果您有兴趣了解有关 Ruby 的更多最佳实践,最好参阅 Gregory Brown 的书 "Ruby Best Practices"。


在相关说明中,许多地方的语言默认为 returning nil。例如,当 if 表达式没有 else 块时,else 块的 return 值为 nil

因此您可以将示例简化为

def foo
  123 if bar
end

如果 bar 不真实,return nil

在Crystal中,nil是表示值不存在的首选方式,通常与其他值组合表示"something can either be returned (T) or not (Nil)"。 API 文档也对此进行了解释,并提到了几种处理 nil 的方法:https://crystal-lang.org/api/0.20.1/Nil.html