rust-quiz:021-closure-or-logical-or.rs
题目
trait Trait {
fn f(&self);
}
impl<F: FnOnce() -> bool> Trait for F {
fn f(&self) {
print!("1");
}
}
impl Trait for () {
fn f(&self) {
print!("2");
}
}
fn main() {
let x = || { (return) || true; };
x().f();
let x = loop { (break) || true; };
x.f();
let x = || { return (|| true); };
x().f();
let x = loop { break (|| true); };
x.f();
let x = || { return || true; };
x().f();
let x = loop { break || true; };
x.f();
}
关键
紧接上题,关于return和break就不多说了。
这道题主要是识别返回值,()打印2,Fn打印1。
题解
1
let x = || { (return) || true; }; x().f();外观看来是闭包,内部的
(return) || true之前有分析过,返回的是()。
后续的||是一个or操作,实际(return)是一个never。
因此打印2。2
let x = loop { (break) || true; }; x.f();循环里面被
break了,单独计算(break)返回()。
且因为()的计算隔离,||实际上是or操作符。
打印2.3
let x = || { return (|| true); }; x().f();整体是闭包,内部根据
return的性质,返回的是|| true,是一个闭包。
打印14
let x = loop { break (|| true); }; x.f();根据上一道题,
break后面跟随的是()的表达式,因此会计算值。
返回的是|| true,是一个闭包。
打印15
let x = || { return || true; }; x().f();return后面紧跟的表达式直接返回|| true,打印16
let x = loop { break || true; }; x.f();根据上一道题的论述,这里会进行计算,返回
|| true,打印1。
不过改为下面的方式返回的就是unitlet x = loop { break {|| true;} }; x.f();因为
break对{}不敏感。
答案
221111
本作品采用《CC 协议》,转载必须注明作者和本文链接
关于 LearnKu
推荐文章: