The following code doesn't compiles:
struct Website {
url: String,
title: Option<String>,
}
fn main() {
let website = Website {
url: "http://www.example.com".into(),
title: Some("Example Domain".into()),
};
if let Website { url, Some(title) } = website {
println!("[{}]({})", title, url);
}
}
The compile error:
error: expected `,`
--> src/main.rs:14:27
|
14 | if let Website { url, Some(title) } = website {
| ^^^^
error[E0425]: cannot find value `title` in this scope
--> src/main.rs:15:30
|
15 | println!("[{}]({})", title, url);
| ^^^^^ not found in this scope
error[E0423]: expected value, found crate `url`
--> src/main.rs:15:37
|
15 | println!("[{}]({})", title, url);
| ^^^ not a value
error: aborting due to 3 previous errors
If I use an tuple instead, the code compiles:
struct Website(String, Option<String>);
fn main() {
let website = Website(
"http://www.example.com".into(),
Some("Example Domain".into()),
);
if let Website(url, Some(title)) = website {
println!("[{}]({})", title, url);
}
}
rustc --version --verbose:
rustc 1.45.0 (5c1f21c3b 2020-07-13)
binary: rustc
commit-hash: 5c1f21c3b82297671ad3ae1e8c942d2ca92e84f2
commit-date: 2020-07-13
host: x86_64-unknown-linux-gnu
release: 1.45.0
LLVM version: 10.0
It works as expected. Change the if-let expression to:
if let Website { url, title: Some(title) } = website {
code will compile.
Maybe the diagnostic could be changed to guide users.
Most helpful comment
Maybe the diagnostic could be changed to guide users.