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 協議》,轉載必須註明作者和本文連結