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

时间:2016-12-21 22:42:32

标签: ruby crystal-lang

我在这里碰到了一堵墙。 假设我的代码如下所示:

def foo
    if bar
        123
    else
        nil
    end
end

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

我意识到我可以毫无问题地返回任何类型的值,但是从更具功能性的背景来看它只是感觉不对。

在Rust中,我会返回Option<T>。这样我就可以轻松测试是返回Some值还是没有值(None)。在Ruby / Crystal中,这似乎是一件愚蠢的事情。

所以,这是问题:
如果没有有用的值可以返回并对其进行测试,我应该返回nil吗?这是处理此类情况的惯用方法吗?如果没有,我该怎么做呢?

2 个答案:

答案 0 :(得分:5)

是,请返回nil

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

进行检查

注意,如果您有兴趣学习Ruby的更多最佳实践,最好参考Gregory Brown撰写的“Ruby Best Practices”一书。

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

所以你可以简化你的例子

def foo
  123 if bar
end
如果nil不是真正的

会返回bar

答案 1 :(得分:3)

在Crystal nil中是表示缺少值的首选方法,通常与其他值组合以表示“可以返回某些内容(T)或不返回{{1} }})”。 API文档也解释了这一点,并提到了几种处理nil的方法:https://crystal-lang.org/api/0.20.1/Nil.html