- 主题:null 是个大错误
Null用来表示“未赋值”这种状态不正合适吗?比如这样使用:
string foo = null
if (should_get_from_input1)
foo = get_from_input1()
else
foo = get_from_input2()
if (foo == null) //"" is valid input
throw Exception("No valid input")
整数同样的。0表示的是一个合法值,而null表示未赋值或者非法值,两者含义不同。
我听人鼓吹过Maybe, 没用过。对Maybe非常不感冒。它不就是用函数式编程的思维强制程序员意识到他们正在处理的变量有可能为空么?写起来比nullable的变量麻烦多了。而受益仅仅是“强制意识到”,如果我处理string/int的时候始终记得它们是nullable,还需要Maybe干嘛?
比如Maybe鼓吹者给的某些用例:
Optional<Integer> option = ...
option.ifPresent(x -> System.out.println(x));
这和
Integer option = null;
...
if (option is not null)
System.out.println(option)
有啥区别?
--
FROM 114.218.92.*
你的意思我明白,但例子不好
应该怎么使用null在最近几年已经被研究的很充分了,比如swift的optional机制。某些时候null是不可缺少的,比如accountInfo的picture,未设定时null也是有意义的状态,代表了此属性不存在。
对于file我支持取消null,这种情况下其实isopen甚至if也没有必要了。open的时候有任何问题直接抛出异常在上层统一收集的可读性更高。
python的None是另外一回事,python的int和string都不可以为None,None是一个特殊类型NoneType。所有的None都是一样的。你“把int赋值成None”,和把int赋值成string是一样的。
python是没有强类型检查的鸭子系统,你是不可能禁止任一类型对象传入的,函数通常也不需要object的实际类型是什么。
【 在 hgoldfish 的大作中提到: 】
: 编程语言最基本的类型,整型、浮点都是没有 null 值的。一般用零来表示“无”这个意思。
: 诚然,很多语言比如 python, java 的字符串和数字类型可以赋值为 null. 其实不对,字符串为空的时候应该用零长度字符串,而不是空指针。在 python, java 语言里面,把数字和字符串变量赋值为 null 都是不合理的代码。
: 这不禁让我发出这个疑问,拥有“空”这个语义是不是应该交由类型来决定才对?
: ...................
--
FROM 155.64.23.*
Null是表示”不存在“,未赋值而使用在任何时候都不对,应在编译层面被禁止而不是额外写if。Nullable类型代表了缺省值为”不存在“。
【 在 byethu 的大作中提到: 】
: Null用来表示“未赋值”这种状态不正合适吗?比如这样使用:
: string foo = null
: if (should_get_from_input1)
: ...................
--
FROM 155.64.23.*
"未赋值而使用在任何时候都不对" -- 这种情况怎么处理:用一个变量来接受UI界面的用户输入,怎样检查用户是否已经输入?除了接受值的变量,再定义一个boolean?这不繁琐吗?我认为这种情况从语义上说变量就是处于“未赋值”,为什么不允许变量就有个未赋值状态呢。
所谓的Maybe不也是默认了变量可能存在未赋值的情况,它只不过实现方式和nullable变量不同。
【 在 xiaoju 的大作中提到: 】
: Null是表示”不存在“,未赋值而使用在任何时候都不对,应在编译层面被禁止而不是额外写if。Nullable类型代表了缺省值为”不存在“。
:
--
FROM 114.218.92.*
对于file我支持取消null,这种情况下其实isopen甚至if也没有必要了。open的时候有任何问题直接抛出异常在上层统一收集的可读性更高
-- 有没有某些情况下需要有个file instance,但不立即打开它?如果存在这种情况,isopen就有意义了。虽然我暂时没想到具体的这种用例,但我也没觉得这种用例一定不存在
--
FROM 114.218.92.*
到底是没有还是程序员往里面塞了0?你这叫百步笑五十步
【 在 hgoldfish 的大作中提到: 】
: c 语言是个低级语言,跟硬件打交道的,自然需要 null pointer
: 但高级语言不那么在乎效率的话,应该抛弃 null 了。
: find_one_by_key() 抛出 KeyError 啊,或者,我觉得更正确的是返回这个类型的空值,比如数字就返回 0,字符串就返回 ""。返回 null 有歧义,到底是没有这个 key 对应的值呢,还是程序员往这个 key 里面写入了 null 值?
: ...................
--
FROM 223.104.3.*
数字返回0这一点值得商榷
到底是数据库里有数据,数据是0,还是压根没找到数据呢?
哈哈哈
【 在 hgoldfish (老鱼) 的大作中提到: 】
: 标 题: Re: null 是个大错误
: 发信站: 水木社区 (Tue Aug 18 00:23:19 2020), 站内
:
: c 语言是个低级语言,跟硬件打交道的,自然需要 null pointer
:
: 但高级语言不那么在乎效率的话,应该抛弃 null 了。
:
: find_one_by_key() 抛出 KeyError 啊,或者,我觉得更正确的是返回这个类型的空值,比如数字就返回 0,字符串就返回 ""。返回 null 有歧义,到底是没有这个 key 对应的值呢,还是程序员往这个 key 里面写入了 null 值?
:
: 【 在 roy (天上掉大饼:学思行言) 的大作中提到: 】
: : C里面空指针不用NULL用啥?
: : 其他语言可以讨论。。。
: : 比如find_one_by_key()这种,在找不到的情况下应该返回啥
: : ...................
:
: --
: 灭绝人性啊
:
:
: ※ 来源:·水木社区 newsmth.net·[FROM: 112.47.122.*]
--
FROM 223.104.3.*
c语言里没有nullptr
【 在 hgoldfish 的大作中提到: 】
: c 语言是个低级语言,跟硬件打交道的,自然需要 null pointer
: 但高级语言不那么在乎效率的话,应该抛弃 null 了。
: find_one_by_key() 抛出 KeyError 啊,或者,我觉得更正确的是返回这个类型的空值,比如数字就返回 0,字符串就返回 ""。返回 null 有歧义,到底是没有这个 key 对应的值呢,还是程序员往这个 key 里面写入了 null 值?
: ...................
--
FROM 123.114.60.*
【 在 hgoldfish (老鱼) 的大作中提到: 】
: 标 题: Re: null 是个大错误
: 发信站: 水木社区 (Tue Aug 18 00:23:19 2020), 站内
:
: c 语言是个低级语言,跟硬件打交道的,自然需要 null pointer
:
: 但高级语言不那么在乎效率的话,应该抛弃 null 了。
:
: find_one_by_key() 抛出 KeyError 啊,或者,我觉得更正确的是返回这个类型的空值,比如数字就返回 0,字符串就返回 ""。返回 null 有歧义,到底是没有这个 key 对应的值呢,还是程序员往这个 key 里面写入了 null 值?
这个可不行,数字的0是在数字的空间里,null不在这个空间里。
就像梨不能代表苹果,僵尸不能代表红脖折磨僵尸家族一样。完全是不同的东西。
有的时候是可以,但严格的来讲不可以不加区分的滥用。
:
: 【 在 roy (天上掉大饼:学思行言) 的大作中提到: 】
: : C里面空指针不用NULL用啥?
: : 其他语言可以讨论。。。
: : 比如find_one_by_key()这种,在找不到的情况下应该返回啥
: : ...................
:
: --
: 灭绝人性啊
:
:
: ※ 来源:·水木社区 newsmth.net·[FROM: 112.47.122.*]
--
FROM 111.161.241.*
Optional真的好用?至少Java里的Optional只是个工具类而已,还是要判断是否为null
【 在 tgfbeta 的大作中提到: 】
: 实际上应该是Union<T, NullType>/Maybe T这样的类型
: 所以当代语言都支持Optional类型
--
FROM 123.125.37.*