Closed8
関数を返す関数を返す
「(関数を返す関数)を返す」(関数という一括りにしてしまって良いかは分からない)
先ずはこうすれば、inner functionを返せる。
fn main() {
foo()();
}
fn foo() -> impl Fn() {
fn bar() {}
bar
}
クロージャでも良い(普通はこっち)
fn main() {
foo()();
}
fn foo() -> impl Fn() {
||{}
}
さて、戻り値に関数のシグネチャを書きたい。
fn main() {
foo()();
}
fn foo() -> impl Fn() -> impl Fn() {
||{ ||{} }
}
でもこれはコンパイルエラーになる。
error[E0562]: `impl Trait` only allowed in function and inherent method return types, not in `Fn` trait return
--> src/main.rs:5:26
|
5 | fn foo() -> impl Fn() -> impl Fn() {
| ^^^^^^^^^
For more information about this error, try `rustc --explain E0562`.
error: could not compile `sandbox` due to previous error
RFC 1522に詳しい説明がある。(TODO: 後で読む)
戻り値の型を書けないのであれば、推論してもらえばいい!
fn main() {
let foo = ||{
||{
||{}
}
};
foo()()();
}
これで関数を返す関数を返す関数を書けた。
やりすぎ注意
fn main() {
||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}};
}
error: could not compile `sandbox`
Caused by:
process didn't exit successfully: `rustc --crate-name sandbox --edition=2021 src/main.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --crate-type bin --emit=dep-info,link -C embed-bitcode=no -C debuginfo=2 -C metadata=6cc2c8934a3eaa5b -C extra-filename=-6cc2c8934a3eaa5b --out-dir /mnt/c/home/tmp/sandbox/target/debug/deps -C incremental=/mnt/c/home/tmp/sandbox/target/debug/incremental -L dependency=/mnt/c/home/tmp/sandbox/target/debug/deps` (signal: 11, SIGSEGV: invalid memory reference)
543ネストまではいけた。
544ネストでアウト。
OKなコード
fn main() {
||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}; // 543
}
NGなコード
fn main() {
||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}; // 544
}
環境によって違うかも。
因みにRust1.66.0 on WSL2
$ rustc -V
rustc 1.66.0 (69f9c33d7 2022-12-12)
ギリOKなコードを実行してみようとしたらコンパイルエラーになった。
(
,)
,(
,)
を追加したらダメだったので、|
,|
,{
,}
を削除して542ネストでやってみたら実行できた。
空白は関係ないっぽいので、1行で解釈できるトークンの数に制限があるっぽい?
いや、そうじゃないっぽい
実行するなら542ネストが限界かな。
fn main() {
(||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{||{}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}})()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()(); // 542
}
このスクラップは2023/03/15にクローズされました