【问题标题】:optional references types [duplicate]可选引用类型[重复]
【发布时间】:2012-04-03 00:31:07
【问题描述】:

可能重复:
Why Option[T]?

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

Scala 的Option[T] 具有三个不同的“空”值:nullNoneSome(null)。就安全性和可表达性而言,这种增加的复杂性究竟给我们带来了什么?我什么时候用哪个?

【问题讨论】:

标签: c# scala null nullable option


【解决方案1】:

好的 Scala 真的只有一个空值:None。不要使用null(与现有Java 代码向后兼容除外)。

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

简短版:

它使可选性质成为显式签名。下面清楚地表明我们期望t 可以是“null”:

def f(t: Option[T]) 

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

def f(i: Option[Int]) = i.map(_ + 1)
f(Some(5)) // Some(6)
f(None)    // None

您可以轻松地将它们与其他 Options 或集合组合起来:

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

【讨论】:

  • 我知道你发布答案已经过去三年了,但仅供参考,我在 Scala 2.11.4 REPL 中得到以下信息: :11: error: type mismatch;找到 : List[Int], 必需: Option[?], for(x y ; z
  • 已修复;现在可以编译了。
【解决方案2】:

在 C# 中(通常在 .NET Framework 中)有 Nullable&lt;T&gt; 类型,它是值类型的一种包装器。

Nullable<int> i = null;
if (i == null) ...
if (i.HasValue) { int k = i.Value; ... }

Nullable&lt;T&gt; 有一个快捷方式:T?

int? i = null;

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

【讨论】:

    猜你喜欢
    • 2014-07-28
    • 1970-01-01
    • 2021-11-20
    • 2020-11-12
    • 2014-01-09
    • 1970-01-01
    • 1970-01-01
    • 2013-06-01
    • 1970-01-01
    相关资源
    最近更新 更多