1

我只是有点撞墙在这里。假设我的代码如下所示:

def foo
    if bar
        123
    else
        nil
    end
end

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

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

在 Rust 中,我会返回一个Option<T>. 这样我就可以很容易地测试是否Some返回了值,或者没有值(None)。不过,在 Ruby/Crystal 中,这似乎是一件愚蠢的事情。

所以,问题来了:
如果nil没有有用的价值来返回和测试,我是否应该返回,这是处理此类情况的惯用方式吗?如果没有,我应该如何以惯用的方式做到这一点?

4

2 回答 2

5

是的,返回nil

Returningnil是 Ruby 中鼓励的最佳实践。你可以检查一下foo.nil?

注意,如果你有兴趣了解更多关于 Ruby 的最佳实践,最好参考 Gregory Brown 的《Ruby Best Practices》一书。


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

因此,您可以将示例简化为

def foo
  123 if bar
end

nil如果bar不真实,它将返回

于 2016-12-21T22:44:38.497 回答
3

在 Crystalnil中是表示不存在值的首选方式,并且通常与其他值组合以表示“可以返回 ( T) 或不返回 ( Nil)”。API 文档也对此进行了解释,并提到了几种处理 nil 的方法:https ://crystal-lang.org/api/0.20.1/Nil.html

于 2016-12-22T10:50:26.570 回答