无条件循环无条件很棒

2021-01-19 01:59:46

这是我对Rust:loop不够满意的一件事。我知道我对此并不怎么想,但每次使用它时,我都会感到非常满意。

循环只是一个无条件的循环:它会永远循环,直到您写break或return为止。

取而代之的是,循环构造通常具有某种终止条件,您的while和for循环。显然Sather具有无条件的循环关键字,如Rust。我之所以知道这一点,是因为编程语言历史学家在bug跟踪器上提到了它。

因为它使我在开始编写循环之前就无需思考如何结束循环。

许多问题很容易识别为需要循环解决方案的问题:我很快意识到,“我必须多次做某事”。

有时,该循环只涉及一次遍历一个容器,这在情况{}情况下很容易被理解为物为物。其他循环则具有更复杂的条件。通常,当我解决循环问题时,我会知道我打算循环执行的一个或某些步骤,但不会提前设想完整的解决方案。

一旦我解决了循环问题,那里就会有一个中断或返回,或者多次中断和/或返回。将它转换为while循环也许是有意义的,也许不是。但是,当您有循环,中断和返回时,并不需要太多。读者在阅读循环中发生的事情之前真的需要了解循环终止条件吗?或者,在使用do {} while(...)循环的语言中,我不知道,但是在循环“结束”之后自然地写终止条件对我来说似乎是合理的。尽管需要通过使循环体保持可读的长度来考虑他们的读者, 。

有趣的是,我现在正在处理的一个小项目包含2个循环实例,2个while循环实例和8个for…in实例;没有标准的while循环。而且我认为循环的读取要比我尝试将它们转换为更好。 while循环。

let(tx,rx)= async_channel ::无界(); let handle = thread :: spawn(move || {let mut context = FsThreadContext :: new(); loop {let msg = block_on(rx .recv()).expect(" recv"); match msg {Message :: Run(f)=> {f(& mut context);},Message :: Shutdown(rsp_tx)=> {context .shutdown(); rsp_tx .send(()).expect( " send"); break;}}}});

let mut header =字符串:: new(); let mut line = String :: new();循环{line .truncate(0); io .read_line(& mut line)吗? ;如果行.is_empty(){返回Err(无论如何!("损坏的帧头")); }让may_body_marker =& line [.. line .len()-1];如果may_body_marker == FRAME_BODY_MARKER { }标头.push_str(& line); }

在类似C的语言中,使用while(true){}编写无条件循环是很常见的。

我对Rust充满了好奇,不知道在编写(true){}时是否能给其他人带来与循环{}同样的满足感,但是我怀疑不是:它的外观和感觉就像是如果我先写一个循环而又……然后我马上被问到“什么?”这个问题,有时我只是不想考虑这个问题。

除了感觉良好之外,Rust具有循环还有一个技术原因:它有助于分析控制流。借助它,编译器可以轻松地知道循环之后的任何代码都无法访问。至少在Rust中这对于类型检查很重要。分析是用其他语言完成的,但根据我的回忆,有时它们有时是特殊情况,而(true){}为此。

这是Rusttreats在操场上循环与真实游戏之间差异的示例。运行它并查看警告,提示编译器发出错误;尝试按照注释中的建议更改示例。

Bonus Rust琐事:您知道循环是一个表达式,其类型与break语句相同,并且循环的结果可以分配给一个值吗? Bug跟踪器上的问题似乎是Rust中关于循环的设计讨论的唯一内容,尽管它对设计师的原始想法很有洞察力。被批准的会议记录仅表明达成共识。