Scala和Python中的None

2020-11-30  本文已影响0人  飞有飞言

总览

Python中的None

java,c,c++,SQL等多数语言中都有一个null的概念,表示指针指向一个空地址。java没有地址一说,java中的null是没有分配指向的对象之意。
python中的None也就相当于其他语言中的null,表示一个对象指向了一个空地址。
python秉承一切皆对象的概念,所以None也是对象。它的类型是

type(None) == NoneType

NoneType唯一的一个实例就是None

对于没有return的方法,或者什么也不return的方法,返回值就是None,例如

def f():
    pass
def g():
    return

这两个方法的返回值都是None
python中对一个变量是不是None一般使用is关键字来判断(也可用==)

a = f()
if a is None: # a == None
    print('a is None')

scala 中的None

scala兼容于java,所以java中的null照样移植到了scala中(但是含义稍有不同)。但None在scala中并不是null。
scala中的None其实是Option类的一个实例

先来看Option类是什么。Option类是一个容器类,也就是放其他对象的一个容器。Option中元素的类型用泛型定义Option[+A], 为什么要有一个加号,后面介绍。
Option它的含义是说,要么有一个元素,要么没有。

  1. 有一个元素,使用Some来表示, 例如,Some(1)表示含有一个整形元素1的Option
  2. 没有元素,使用None来表示

None一般使用在模式匹配中,判断一个Option类型的对象是否有值。例如

xs.headOption match {
  case Some(x) => println(s"xs first value is $x")
  case None => println("xs is empty")
}

None是所有Option类型的子类,这一点可以从Option的定义看到
abstract class Option[+A]
而None的定义是
case object None extends Option[Nothing]
因为在scala中,Nothing是所有其他类的子类,而且Option支持协变,那么Option[Nothing]就是所有Option[+A]的子类了。 也就是说None的类型可以在任何需要Option类型的地方。

总结

本文讲了Scala和Python中的None的不同,并且从代码层面讲解了scala中的None的某些特点。

上一篇下一篇

猜你喜欢

热点阅读