飘10:55:45


哪位大神给简单解释一下,断言是什么东西


傲慢与偏见10:56:04


就是条件为true就过了


CrLF071010:56:06



Mike猫 10:56:07


就是如果你是假的,就立即停止执行


CrLF071010:56:21


if !xxx { panic!{"Failed!"} }


Mike猫 10:56:27


如果发现你是sb,就把你扔到窗外


Ariane.10:56:49


+1


飘10:56:55


这个主要用在什么场景


Mike猫10:57:06


各种业务场景


Mike猫 10:57:12


还有测试


飘10:57:52


业务场景?遇见false就停止执行吗


飘10:59:20


不明白,如果某句assert判断是false,会对代码执行有什么影响,后面的代码怎么办


飘(254395180) 10:59:50


是抛出异常吗


Mike猫 10:59:56


@飘 不执行了


CrLF071010:59:57


assert 表示你的逻辑无法覆盖这种情况了,放弃继续执行,避免更大的破坏,直接crash


:00:00


给个链接


月下独殇 11:00:02


rustprimer里面的练习题,有源代码参考吗


Mike猫 11:00:02


直接进程退出


CrLF0710 11:01:37


rust这边不太用异常的,有Result用

香港-eMeow 11:02:32
简单一句:assertion是用来判断前提条件
 11:02:41
@Mike Tang ok
香港-eMeow 11:03:12
函数 的定义里面有前置条件、后置条件,而assert是用来判断前置条件的
Mike猫 11:03:17
@香港-eMeow 不错
Mike猫 11:03:28
后置条件是什么
香港-eMeow 11:04:05

业务场景举例,function(x) 的前置条件,x != nullptr,因此 assert(x != nullptr)
飘11:04:18
如果有debug工具,是不是assert就不需要了
香港-eMeow11:04:28
显然不可能
香港-eMeow11:04:48
前置条件代表的是输入参数必须符合某些条件
11:04:49
assert的作用就是提示程序员:你的逻辑走错了
香港-eMeow11:04:54
跟debug没有任何关系
香港-eMeow 11:05:00
因为它根本就不是bug
飘 11:05:38
assert不是用来调错的吗
CrLF0710 11:05:43
额,前置条件不满足肯定是别处的bug嘛……
Mike猫11:05:57

香港-eMeow11:06:02
assert用来调错??
11:06:11
@ELTON 后置条件是啥?
香港-eMeow11:06:23
那你跑在线上环境,x = nullptr了就不用检查了么
香港-eMeow 11:06:50
没有人检查后置条件的吧
香港-eMeow 11:07:02
后置条件就是函数返回之前要满足什么条件
Mike猫11:07:13

Mike猫 11:07:16
学习了
香港-eMeow 11:07:22
比较实际一点的东西比如返回之前要delete一下ptr之类的事情
飘 11:07:22
x = nullptr这种不是开发时就该被解决掉吗
香港-eMeow 11:07:46
只是举个例子。比如 function(x) assert(x > 10)
 11:08:05
受教了
飘11:08:07
如果已经上线了,这还不叫bug?
香港-eMeow11:08:22
对于此函数内部实现来讲,不叫bug
 11:08:33
release版本里的assert是不起作用的
香港-eMeow 11:08:40
就像我做了一个功能给别人调用,我要保证我的功能没有bug即可
香港-eMeow 11:09:08
release版本assert起不起作用只是一个编译选项的问题
11:09:43
@ELTON 原来如此,默认不起作用对吧?
飘 11:09:53
so,什么情况下才需要assert呢
香港-eMeow11:11:03

失落的神喵11:11:15
assert 在release下也是起作用的,会 panic,好像 C++ 是在 release状态关了assert?
香港-eMeow11:11:41
C++的stdlib里面的实现是NDEBUG这个宏
失落的神喵11:11:58
看rust的 assert! 宏,没考虑debug和release状态
飘11:12:01
或者说,在什么场景下需要判断前置条件呢
香港-eMeow 11:12:18
任何场景下都要判断前置条件,难道不是么
香港-eMeow11:12:25
你不需要对输入进行校验么
失落的神喵11:12:30
比如,数组index操作,你越界了,没法做任何错误处理,就只有退出算了
香港-eMeow 11:12:39
或者说,校验已经被类型系统帮你做了
香港-eMeow 11:12:46
你不用手动自己做而已
飘11:13:55
是需要校验,但是校验不通过程序就得推出吗
香港之神真的神11:14:02
我的理解是你assert时候, 要求的条件是由调用者来保证的, 不是由你来保证的, 至所以在写程序的时候加上, 是为了保证调用者没有给错误的输入
香港-eMeow11:14:22
对于前置条件来讲,校验不通过程序就要退出
香港-eMeow11:14:31
前置条件,与错误,不是同一个东西
香港-eMeow 11:14:42
错误,对于函数来讲是正常的输出
香港-eMeow 11:14:53
而前置条件不满足,连函数都不可以调用
香港之神真的神 11:15:06
对的
香港之神真的神 11:15:26
香港之神表达的更准确
香港之神真的神 11:16:55
加上assert是保证前置条件一定要成立, 这是调用函数者要保证的
香港之神真的神 11:17:47
就像C库里的一些函数, 它默认的前置条件是你传入的指针非空, 它没有做这个判空处理
香港-eMeow11:17:52
没错,从这个角度理解也是对的
香港-eMeow11:18:08
前置条件:调用者必须保证的条件
飘11:18:14
换个说法。函数要一个正数,调用者却传了个负数。那么参数校验之后,就返回个-1代表参数不合法。这种场景叫  前置条件  吗
香港-eMeow 11:19:26
你这个表达是有问题的。因为你没说清楚,你的这个函数到底可不可以处理负数的情况
香港-eMeow11:19:47
若可以,但处理的方式是return -1;
香港-eMeow11:19:53
那这个就不是前置条件


香港-eMeow11:20:01
因为它是可以处理的
無花果 11:20:39
@香港-eMeow 你好辛苦,其实说的很明白了
Jin11:20:58
有些人不喜欢这样的约定,一定要函数能够处理所有可能的问题,这样也许程序稳定性有保障,但是代码却是越来越不堪入目,还可能影响性能。
香港-eMeow 11:21:02
换个例子,我一个函数,要求你传一个指针ptr,我里面 ptr->xxx(); 。这意味着 ptr 必须不能为nullptr,因为若为nullptr,我无法产生任何有效的输出
香港-eMeow 11:21:28
即 ptr != nullptr 是我的函数可以执行的前置条件
香港之神真的神11:21:53
其实你不用太过纠结,这就是一个概念的问题, 对于个人写的代码, 你做错误过滤就好了
無花果11:22:10
函数执行的要求就是 所谓的前置条件
香港之神真的神 11:22:16
Bug怎么少怎么来, 因为你不能保证你的同事也理解你的前置设定
Jin11:23:46
nullptr这种还是有类型保证比较好
香港之神真的神 11:24:16
前置设定就是一个函数的自变量定义区间, 在这个区间内的值, 被分成两部分, 一部分是正确的, 一部分是错误的
香港之神真的神 11:24:51
所以对于一个函数来说, 无论是正确的还是错误的输入都得是它自变量定义区间内的值
香港-eMeow 11:24:54
嗯,在C++/Rust这些语言,它有引用类型,它用类型系统来保证(当然,也允许你作死)
飘11:25:22
好吧,我写的那点代码都是自产自销的。还没有要求别人必须要规矩办事的
Jin11:26:05
队友不规矩就很蛋疼
無花果 11:27:54
@香港-eMeow 后置条件,这个调用者没法保证吧,人家不懂你函数的实现,你既然接受人家给你的参数,你见过就挂掉了,这如果是在线服务,那个码农不被骂死才怪
無花果11:28:39
一般错误返回这种方式
香港之神真的神 11:28:44
还是没理解
飘11:28:45
就是说,要调用者自己先把不合法的东西在调用前解决掉。否则,后果也是调用者担
香港-eMeow11:28:45
后置条件一般没人管的吧。。。
香港-eMeow11:29:04
后置理应由函数实现者保证
無花果11:29:11

飘 11:31:35
所以说,我还是不懂,在什么场景下,会允许这种 你不按规矩,就给你脸色 的代码
Jin 11:31:42
前置条件看不出来也写注释啊
Jin 11:32:32
不写注释是实现者的锅,不看接口文档无脑调用就是调用者的锅了
無花果 11:33:00
一般,我们开发,都不设置前置条件,来这不拘,但你的调用者得,处理错误;如果你像友好的方式提醒,你调用前自己检查参数
失落的神喵11:36:23
Rust中会发生 panic! 的方法,基本是这样的情况,比如 Option::unwrap() / Vec的index越界。比如 index 越界的情况,你不panic,就会导致内存不安全,你会读取到脏数据,或者往不属于你的内存写数据,这是比程序退出更严重的问题,所以一定要前置条件
飘11:37:59
明白了
飘11:38:57
问个题外话,群里为什么这么多喵
Mike猫 11:41:31
未来喵星人占领地球
猫小二 11:41:37
看群主的名字就知道了
Mike猫11:41:48
github也是猫啊