- 主题:null 是个大错误
null这个语义肯定是需要的啊, 只不过有些语言里没有强制在类型上体现出来.
消灭了空指针照样也会有大量的非法使用 Option::unwrap() 的错误...
【 在 hgoldfish (老鱼) 的大作中提到: 】
编程语言最基本的类型,整型、浮点都是没有 null 值的。一般用零来表示“无”这个意思。
诚然,很多语言比如 python, java 的字符串和数字类型可以赋值为 null. 其实不对,字符串为空的时候应该用零长度字符串,而不是空指针。在 python, java 语言里面,把数字和字符串变量赋值为 null 都是不合理的代码。
这不禁让我发出这个疑问,拥有“空”这个语义是不是应该交由类型来决定才对?
* 初始化但是未打开的文件是空的,打开出错的文件是空的。
* alpha 通道为 0 的 color 是空的
* 拥有零个元素的列表的空的
消灭了空指针,这个世界就没有空指针错误了对吧。关键是让类型来决定自己是否为空,写出的代码更精简,可阅读性更强:
if (file && file.isOpen())
blahblah...;
以后只要写:
if (file)
blahblah...;
就行了。
所以我觉得在高级编程语言里面,压根就不该存在 null 指针啊。之所谓存在空指针,是否只是一种性能优化的折衷。程序员为这个性能优化付出太多了。
--
FROM 58.246.6.*
有足够语法糖,就真的好用。
【 在 xeagle (静下心来编程) 的大作中提到: 】
: Optional真的好用?至少Java里的Optional只是个工具类而已,还是要判断是否为null
--
FROM 111.161.241.*
这根本不是语法糖好不好,只是个工具类而已。谁都可以写一个出来
【 在 tgfbeta 的大作中提到: 】
: 有足够语法糖,就真的好用。
:
--
FROM 123.125.37.*
很简单,Maybe|Optional|Result的目的是从语法上使得nullable比non-nullable更麻烦,不鼓励你在可以non-nullable的地方随便用nullable。
而Java的nullable by default效果刚好相反。
类似的,C可以忽略返回值,使得检查错误码比忽略错误码更麻烦,这也是个错误的设计。
【 在 byethu 的大作中提到: 】
: Null用来表示“未赋值”这种状态不正合适吗?比如这样使用:
: string foo = null
: if (should_get_from_input1)
: ...................
--
修改:ilovecpp FROM 124.78.175.*
FROM 124.78.175.*
空指针为什么要消灭?
【 在 hgoldfish (老鱼) 的大作中提到: 】
: 编程语言最基本的类型,整型、浮点都是没有 null 值的。一般用零来表示“无”这个意思。
: 诚然,很多语言比如 python, java 的字符串和数字类型可以赋值为 null. 其实不对,字符串为空的时候应该用零长度字符串,而不是空指针。在 python, java 语言里面,把数字和字符串变量赋值为 null 都是不合理的代码。
: 这不禁让我发出这个疑问,拥有“空”这个语义是不是应该交由类型来决定才对?
: ...................
--
FROM 113.109.26.*
rust里面"?" operator是语法糖。
【 在 xeagle 的大作中提到: 】
: 这根本不是语法糖好不好,只是个工具类而已。谁都可以写一个出来
--
FROM 124.78.175.*
语法糖是指Swift里的 ? ?? 和! 以及if let等等
还有kotlin的? !!等
【 在 xeagle (静下心来编程) 的大作中提到: 】
: 这根本不是语法糖好不好,只是个工具类而已。谁都可以写一个出来
--
FROM 111.161.241.*
这么难的问题,不懂。
但最新版本的C# 据说结束了这份痛。
高级语言就是好,不用纠结这种底层问题。
【 在 hgoldfish 的大作中提到: 】
: 编程语言最基本的类型,整型、浮点都是没有 null 值的。一般用零来表示“无”这个意思。
:
: 诚然,很多语言比如 python, java 的字符串和数字类型可以赋值为 null. 其实不对,字符串为空的时候应该用零长度字符串,而不是空指针。
: ....................
--
FROM 124.160.153.*
c# .? 了解一下?
--
FROM 111.198.57.*
我去这就扯淡了,那我存了个空字符串跟没存不是区分不出来了
【 在 hgoldfish 的大作中提到: 】
: c 语言是个低级语言,跟硬件打交道的,自然需要 null pointer
: 但高级语言不那么在乎效率的话,应该抛弃 null 了。
: find_one_by_key() 抛出 KeyError 啊,或者,我觉得更正确的是返回这个类型的空值,比如数字就返回 0,字符串就返回 ""。返回 null 有歧义,到底是没有这个 key 对应的值呢,还是程序员往这个 key 里面写入了 null 值?
: ...................
--
FROM 171.83.95.*