## 事象
以下の[[クロージャ (Rust)|クロージャ]]の[[戻り値型]]が空[[タプル (Rust)|タプル]] (`()`) と推測されてしまう。
```rust
let expensive_closure = |num| {
println!("calculating slowly...");
thread::sleep(Duration::from_secs(2));
num
};
```
型を明示すれば問題ない。
```rust
let expensive_closure = |num| -> u32 {
println!("calculating slowly...");
thread::sleep(Duration::from_secs(2));
num
};
```
バージョンは `0.4.182.4996-222`。`0.4.183.5026-222`にバージョンアップしても変化なし。
## 原因
不具合ぽい。
<div class="link-card-v2">
<div class="link-card-v2-site">
<img class="link-card-v2-site-icon" src="https://github.githubassets.com/favicons/favicon.svg" />
<span class="link-card-v2-site-name">GitHub</span>
</div>
<div class="link-card-v2-title">
Wrong type inference for closure without explicit return type · Issue #8892 · intellij-rust/intellij-rust
</div>
<div class="link-card-v2-content">
Environment IntelliJ Rust plugin version: 0.4.171.4656-221 Rust toolchain version: 1.61.0 (fe5b13d68 2022-05-18) ...
</div>
<img class="link-card-v2-image" src="https://opengraph.githubassets.com/0ce6dd95093ff27fe5c3bf8285df7cc27c6b1936586ec504cc34db5aab3e1d96/intellij-rust/intellij-rust/issues/8892" />
<a href="https://github.com/intellij-rust/intellij-rust/issues/8892"></a>
</div>
## 回避策
以下のように戻り型を`_`で明示する方法がある。
```rust
let expensive_closure = |num| -> _ {
println!("calculating slowly...");
thread::sleep(Duration::from_secs(2));
num
};
```