首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >可选引用类型

可选引用类型
EN

Stack Overflow用户
提问于 2012-03-17 23:15:09
回答 2查看 646关注 0票数 2

可能重复:

Why Option[T]?

引用类型提供特殊值null,意思是“缺少值”。值类型没有这样的值,这就是为什么C#引入了可选的值类型(以及它们的特殊语法)。

Scala的Option[T]有三个不同的“空”值:nullNoneSome(null)。在安全性和表现性方面,这种增加的复杂性究竟给我们带来了什么?我什么时候才能用它?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-17 23:23:50

好的Scala实际上只有一个空值:None。不要使用null (除了与现有代码的向后兼容性)。

关于为什么Option[T]是有用的,有很多答案。例如:参见this

简短的版本:

它使可选性质成为一个明确的签名。以下内容清楚地表明,我们预计t可能为"null":

代码语言:javascript
复制
def f(t: Option[T]) 

您不需要在操作之前进行空检查:(i: Option[Int]) => i.map(_ + 1)可以很好地工作,无论iSome(5)还是None,并保留Option包装器以指示输入可能是None (因此,输出也可能是None )。

代码语言:javascript
复制
def f(i: Option[Int]) = i.map(_ + 1)
f(Some(5)) // Some(6)
f(None)    // None

您可以轻松地将它们与其他Option或集合组合在一起:

代码语言:javascript
复制
val a: Option[Int] = Some(1)
val b: Option[Int] = Some(6)
val c: Option[Int] = Some(5)
val d: Option[Int] = None
for(x <- a; y <- b; z <- c) yield x + y + z // Some(12)
for(x <- a; y <- d; z <- c) yield x + y + z // None
票数 5
EN

Stack Overflow用户

发布于 2012-03-17 23:25:32

在C# (以及.NET框架中的一般情况)中,存在类型Nullable<T>,它是值类型的包装器。

代码语言:javascript
复制
Nullable<int> i = null;
if (i == null) ...
if (i.HasValue) { int k = i.Value; ... }

Nullable<T>有一个快捷方式:T?

代码语言:javascript
复制
int? i = null;

另一方面,也有可选的参数。您必须定义这些值的默认值。没有办法知道他们是否失踪了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9754639

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档