有很多人认为特殊值null
的概念(因为它用于C,Java,C#,Perl,Javascript,SQL等语言)是一个坏主意。关于SO和P.SE,有几个问题,例如Best explanation for languages without null和Are null references really a bad thing?。
但是,我找不到任何没有它们的语言。我熟悉的所有语言都有null
或类似的东西(例如Perl中的“undefined”)。
我意识到,每种语言都需要某种方式来表达“缺乏价值”。但是,不是使用“null”或“undefined”,而是使用Maybe
(Haskell)或Optional
(Guava)之类的东西也可以明确这一点。具有“null”或“undefined”的主要区别在于,如果对象具有特定类型(Maybe,Optional ...),则该对象只能具有“无值”。相反,“null”/“undefined”通常是每种类型可能的有效值。
在这个意义上,是否存在没有“null”或类似概念的语言?
这是一个不完整的语言列表,没有你所描述的null
/ undefined
/ nothing
,根据维基百科首次出现的年份排序。
None
。nil
,但在编译时阻止所有空指针异常。?
语法的可选类型。?
语法的可选类型。?
语法的可选类型。undefined
或null
作为变体。Maybe
。?
语法的可选类型。Option
。?
语法的可选类型。Option
。?
语法的可选类型。null
option
。Maybe
。option
。随意补充列表。
Tcl没有任何null的概念。一切都是值,所有值都有一个字符串表示(通常概括为“Everything is a String”)。
最接近null的是空字符串。
传达“无价值”的概念需要一些创造力。
当然,如上所述,有些人使用空字符串来表示没有价值。为此,空字符串在您正在处理的数据集中无效。令人惊讶的是,很多现实世界的数据属于这一类。
指示缺少价值的另一种方法是简单地抛出错误。在某些情况下,这正是应该做的,而不是返回一些null或错误值(从C学习的反模式和难以摆脱的习惯)。
另一种方法是返回一个空列表(列表是Tcl相当于其他语言中的数组)。空列表的字符串表示形式是空字符串。但幸运的是,包含空字符串的列表的字符串表示形式是两个双引号:"\"\""
。这种差异允许人们区分包含“无”的列表和包含其中没有字符的字符串的列表。
最后,有些人只是通过简单地不声明变量来表示缺少值(或者解开它,这是tcl中的一个东西)。这可能听起来很奇怪,因为变量似乎是一个编译时构造(虽然值是运行时构造)但在tcl中一切都是运行时。因此,代码可以使用不存在的变量作为信号。尝试读取未声明的变量会导致您可以捕获的错误。此外,Tcl还允许您使用内省来检查解释器的状态。因此,您可以使用[info exist x]
检查是否存在名为x
的变量。
您已经提到Haskell作为没有“null”的语言的示例。 ML系列中还有标准ML,OCaml或F#等语言。许多动态类型语言也没有空指针,方案就是一个很好的例子。