返回可选值的惯用方式是什么?
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
我只是有点 运行 靠墙。 假设我的代码如下所示:
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