【问题标题】:What is the idiomatic way of returning optional values?返回可选值的惯用方式是什么?
【发布时间】:2016-12-21 22:42:32
【问题描述】:

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

def foo
    if bar
        123
    else
        nil
    end
end

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

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

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

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

【问题讨论】:

  • 致接近投票者,您能否解释一下自己,以便我改进我的问题?
  • 我不认为在这个问题中混合 Ruby 和 Crystal 是合理的 - 不是每个 Ruby 成语都是 Crystal 成语。
  • @mgarciaisaia 是对的。我标记了两者,因为在这种情况下它并不重要。 Crystal 有 Nil 类型并试图感觉像 Ruby,所以我认为这个问题适用于两者。

标签: ruby crystal-lang


【解决方案1】:

是的,返回nil

返回 nil 是 Ruby 中鼓励的最佳实践。您可以通过foo.nil? 进行检查

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


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

因此您可以将示例简化为

def foo
  123 if bar
end

如果bar 不真实,将返回nil

【讨论】:

  • 谢谢。您能否稍微扩展您的答案,并添加一个指向鼓励这种行为的官方 Ruby 文档的链接?除此之外,答案很好,我会在几分钟内接受它:)
  • @splittydev 有什么特别需要我扩展的吗?官方的 ruby​​ 文档不包含这样的最佳实践,假设您从其他来源学习它们。最好的参考可能是 Gregory Brown 的《Ruby Best Practices》一书
  • 如果官方 ruby​​ 文档没有涵盖这一点,那么您的答案就很好。谢谢
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-23
    • 2012-10-27
    • 2023-03-26
    • 2016-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多