Scala中Null/Nothing/Unit的用法

Seb*_*ber 91 scala

我刚读过:http://oldfashionedsoftware.com/2008/08/20/a-post-about-nothing/

据我所知,这Null是一个特点,它的唯一例子是null.

当一个方法采用Null参数时,我们只能传递一个Null引用或null直接传递它,但不能传递任何其他引用,即使它是null(nullString: String = null例如).

我只是想知道在哪些情况下使用这个Null特性可能会有用.还有没有什么特质,我真的没有看到更多的例子.


我真的不明白使用Nothing和Unit作为返回类型之间的区别是什么,因为两者都没有返回任何结果,当我有一个执行日志记录的方法时,如何知道使用哪一个?


除了返回类型之外,您是否将Unit/Null/Nothing用作其他东西?

Nat*_*hes 77

如果方法永远不会返回,则只使用Nothing(意味着它不能通过返回正常完成,它可能会抛出异常).没有什么是永远不会被实例化的,并且有利于类型系统(引用James Iry:"Scala底部类型的原因与它在类型参数中表达方差的能力有关.").从您链接到的文章:

Nothing的另一个用途是作为永不返回的方法的返回类型.如果你考虑它就有意义了.如果方法的返回类型为Nothing,并且绝对没有Nothing的实例,那么这样的方法必须永远不会返回.

您的日志记录方法将返回Unit.有一个值单位,所以它实际上可以返回.来自API文档:

Unit是scala.AnyVal的子类型.只有一个类型为Unit,()的值,并且它不由底层运行时系统中的任何对象表示.返回类型为Unit的方法类似于声明为void的Java方法.

  • @Sabastien:它没有正常返回,它可能会抛出异常(请参阅http://james-iry.blogspot.com/2009/08/getting-to-bottom-of-nothing-at-all.html).如果阻塞调用仅以抛出异常结束,则会计算.谢谢你的问题,这需要澄清. (3认同)
  • 谢谢,"永不返回"是否意味着调用无限期地阻塞(例如,作业调度程序的启动方法?) (2认同)

pag*_*_5b 18

你引用的文章可能会产生误导.该Null类型用于与Java虚拟机兼容,特别是Java.

我们必须考虑Scala:

  • 完全是面向对象的:每个值都是一个对象
  • 是强类型的:每个值都必须有一个类型
  • 需要处理null对访问的引用,例如Java库和代码

因此,有必要为null值定义一个类型,即Null特征,并将其null作为唯一的实例.

Null除非您是类型系统或正在编译器上进行开发,否则在类型中没有什么特别有用的.特别是我看不出Null为方法定义类型参数的任何合理的理由,因为你不能传递任何东西null


EEC*_*LOR 15

除了返回类型之外,您是否将Unit/Null/Nothing用作其他东西?


Unit 可以像这样使用:

def execute(code: => Unit):Unit = {
  // do something before
  code
  // do something after
}
Run Code Online (Sandbox Code Playgroud)

这允许您传入要执行的任意代码块.


Null可以用作可为空的任何值的底部类型.一个例子是:

implicit def zeroNull[B >: Null] =
    new Zero[B] { def apply = null }
Run Code Online (Sandbox Code Playgroud)

Nothing 用于定义 None

object None extends Option[Nothing]
Run Code Online (Sandbox Code Playgroud)

这允许您指定None任何类型的Option因为Nothing'扩展'一切.

val x:Option[String] = None
Run Code Online (Sandbox Code Playgroud)


Cur*_*ycu 6

如果你使用Nothing,没有事情要做(包括打印控制台),如果你做某事,使用输出类型Unit

object Run extends App {
  //def sayHello(): Nothing = println("hello?")
  def sayHello(): Unit = println("hello?")
  sayHello()
}
Run Code Online (Sandbox Code Playgroud)

......然后怎么用Nothing

trait Option[E]
case class Some[E](value: E) extends Option[E]
case object None extends Option[Nothing]
Run Code Online (Sandbox Code Playgroud)


dre*_*xin 5

我从来没有真正使用过该Null类型,但你使用的Unit是java使用的地方void.Nothing是一种特殊的类型,因为正如内森已经提到的那样,没有实例Nothing.Nothing是一种所谓的底部类型,这意味着它是任何其他类型的子类型.这个(以及逆变型参数)就是为什么你可以将任何值前置Nil- 这是一个List[Nothing]- 然后列表将是这个元素类型.None如果是类型的话Option[Nothing].每次尝试访问此类容器中的值都会引发异常,因为它是从类型方法返回的唯一有效方法Nothing.