do{}while(false) 这么使用上瘾了

2018-06-06 17:19:14 +08:00
 814084764

如题。

特别是在需要 return 的函数里面,真 TM 爽!

8504 次点击
所在节点    程序员
46 条回复
xiangyuecn
2018-06-06 18:50:42 +08:00
前端后端习惯性使用 while(true){........; break;}, 你这个少 3 个字符, 算你牛

套一层之后的最大好处是,不支持 goto、break 的代码段,可以随意 break 跳出去(滑稽
LevineChen
2018-06-06 19:03:20 +08:00
return early 的一种写法, 多个 return 会使代码变得混乱, 通过 do while 进行流程控制可以 做到一个入口 一个出口. 而且可以避免 if else 嵌套 阻止箭头形代码的形成. 好处多的数不过来 大家了解一下吧
Loren
2018-06-06 19:29:55 +08:00
C 语言的宏里也常用
bumz
2018-06-06 19:42:35 +08:00
```
a();

do {
b();
if (c()) break;
d();
} while (false);

e();
```

等价于

```
a();
b();
if (!c()) {
d();
}
e();
```

但前者更令人费解
hsuan
2018-06-06 20:03:30 +08:00
C 里非常常见的写法,居然这么多人不知道?看来 C 真是没落了。
VDimos
2018-06-06 20:27:36 +08:00
让我想起了 react 里面的用抛出错误的方式中断,有种异曲同工之妙
thedrwu
2018-06-06 20:33:30 +08:00
在古老的 C 技巧中常常用来写在宏里当作简单而正确的的 inline (比如 linux 内核中)

若是如楼上所说用作 break,那一般是编码有问题,应该试着把其中内容封装成一个函数。装成函数还能有利于单元测试。
iceheart
2018-06-06 20:56:45 +08:00
直接用 lambda 会更爽
fuxiuyin
2018-06-07 00:42:20 +08:00
这算是 goto 吧
takeoffyoung
2018-06-07 00:45:01 +08:00
@ysc3839 golang 的 defer 就是为这个需求量身定做
mon6912640
2018-06-07 01:36:48 +08:00
感谢,学到了一个实用技巧,真是巧妙
redsonic
2018-06-07 02:03:50 +08:00
竟然这么多人不知道,记得是内核开发面试必问的一道题。。
FrankFang128
2018-06-07 02:36:08 +08:00
还不如 goto 好读……
guanhui07
2018-06-07 08:25:44 +08:00
虽然我也喜欢用 goto ,很多企业 不会让用 goto 吧 -
wanderpoet
2018-06-07 08:30:01 +08:00
对于 goto 的因噎废食真是够了 滥用当然不行 但也没必要一刀切的禁用 goto
DOLLOR
2018-06-07 08:32:47 +08:00
@xiangyuecn JS 有可读性更好的方法……

// Using a labeled block with break
foo: {
console.log('face');
break foo;
console.log('this will not be executed');
}
console.log('swap');

// this will log:

// "face"
// "swap
ytlm
2018-06-07 08:44:30 +08:00
在某些情况下这种写法还是比较有用处的
grewer
2018-06-07 09:36:01 +08:00
在 do 里面的 break 相当于一个匿名函数的 return
dychenyi
2018-06-07 09:37:03 +08:00
@LevineChen 对的, 这种函数开始是初始化,最后是析构,释放内存的代码,如果写 return,相当于每一个 return 前都要释放
des
2018-06-07 09:38:32 +08:00
@DOLLOR lint 默认禁止这么用

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/460932

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX