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
,是一个闭包。
打印1
4
let x = loop { break (|| true); }; x.f();
根据上一道题,
break
后面跟随的是()
的表达式,因此会计算值。
返回的是|| true
,是一个闭包。
打印1
5
let x = || { return || true; }; x().f();
return
后面紧跟的表达式直接返回|| true
,打印1
6
let x = loop { break || true; }; x.f();
根据上一道题的论述,这里会进行计算,返回
|| true
,打印1
。
不过改为下面的方式返回的就是unit
let x = loop { break {|| true;} }; x.f();
因为
break
对{}
不敏感。
答案
221111
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: