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