Scala和Python中的None
总览
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它的含义是说,要么有一个元素,要么没有。
- 有一个元素,使用
Some
来表示, 例如,Some(1)
表示含有一个整形元素1的Option - 没有元素,使用
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的某些特点。