Scala的空/没有/股的用法(Usages of Null / Nothing / Unit in

2019-08-31 22:35发布

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

据我了解, Null是一个特点和它的唯一实例为null

当一个方法需要一个Null参数,那么我们只能传递一个Null引用或null直接,但不排除任何其它的参考,即使它是空( nullString: String = null例如)。

我只是想知道在使用此情况下, Null特征可能是有用的。 也有没有什么特点了,我真的没有看到任何更多的例子。


我真的不明白要么就是使用没有与单位作为返回类型之间的区别,因为两者不返回任何结果,怎么知道什么时候我有一个执行日志记录的方法。例如使用哪一个?


你有单位/空/没有的用途为除返回类型其他什么东西?

Answer 1:

你只用咱这方法从不返回(这意味着它不能被恢复正常完成,它可以抛出一个异常)。 没有什么是从来没有实例化,是有类型系统的好处(报价詹姆斯IRY: “之所以Scala有一个底部类型依赖于它来表达类型参数变化的能力。” )。 从你的文章链接到:

另外一个没有使用的是作为返回类型为一去不复返的方法。 这是有道理的,如果你想想看。 如果一个方法的返回类型是什么,绝对不存在没有的情况下,那么这种方法必须一去不复返。

你测井方法将返回单位。 有一个值单位,因此实际上可以返回。 从API文档 :

单位是scala.AnyVal的亚型。 只有一种类型的单元,()的值,并且它不是由在底层运行时系统的任何对象表示。 与返回类型单元的方法是类似的,其宣布无效的Java方法。



Answer 2:

你引用的文章可能会产生误导。 所述Null类型是存在的,用于与Java虚拟机的兼容性,和Java尤其如此。

我们必须考虑到斯卡拉

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

因此有必要定义用于一个类型null值,它是Null的性状,并且具有null作为其唯一的实例。

有没有在特别有用Null类型,除非你是类型系统或你的编译器开发。 尤其是我看不到任何理由懂事定义一个Null类型参数的方法,因为你不能传递任何东西,但null



Answer 3:

你有单位/空/没有的用途为除返回类型其他什么东西?


Unit可以使用这样的:

def execute(code: => Unit):Unit = {
  // do something before
  code
  // do something after
}

这使您可以在代码中的任意块传递给被执行。


Null可作为底类型,它可为空的任意值。 一个例子是这样的:

implicit def zeroNull[B >: Null] =
    new Zero[B] { def apply = null }

Nothing在定义中使用None

object None extends Option[Nothing]

这允许您指定一个None任何类型的Option ,因为Nothing “延伸”的一切。

val x:Option[String] = None


Answer 4:

我从来没有实际使用的Null类型,但您使用Unit ,在那里你会在Java的使用voidNothing是一种特殊类型的,因为作为弥敦道已经提到的,不能有任何的情况下NothingNothing是所谓的底部型的,这意味着,它是一个子类型的任何其它类型的。 这(和逆变类型参数)就是为什么你可以在前面加上任意值Nil -这是一个List[Nothing] -然后列表将是这个元素的类型。 None也如果类型的Option[Nothing] 。 每一个尝试访问该容器内的值会抛出一个异常,因为它是唯一有效的方法,从类型的方法返回Nothing



Answer 5:

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

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

...那么如何使用Nothing

trait Option[E]
case class Some[E](value: E) extends Option[E]
case object None extends Option[Nothing]


Answer 6:

没有什么是常常隐式使用。 在下面的代码, val b: Boolean = if (1 > 2) false else throw new RuntimeException("error") else子句是类型没有什么 ,这是布尔的子类的(以及任何其他AnyVal)。 因此,整个分配是有效的编译器,虽然else子句并没有真正返回任何东西。



Answer 7:

下面是一个例子Nothingscala.predef

  def ??? : Nothing = throw new NotImplementedError

如果你不熟悉(和搜索引擎无法搜索就可以了) ??? 是Scala的对任何有尚未实施的占位符的功能。 就像科特林的TODO

创建模拟对象时,可以使用同样的伎俩:覆盖使用自定义未使用的方法notUsed方法。 不使用的优点??? 是,你不会得到编译东西你永远不打算实施警告。



Answer 8:

在类别理论没有什么方面是初始对象单元是一个终端对象

https://en.wikipedia.org/wiki/Initial_and_terminal_objects

初始对象也被称为共边界通用的 ,并且终端的对象也被称为最终

如果一个对象是在初始终端 ,它被称为零对象对象。



文章来源: Usages of Null / Nothing / Unit in Scala
标签: scala