Understanding Rust Error E0164
Introduction to Rust Error E0164
Rust Error E0164 occurs when a non-tuple struct or non-tuple variant is used as a pattern in a match expression. In this article, we will discuss the error in detail and provide examples to help you avoid this issue.
Example of Erroneous Code
Consider the following erroneous code example: #![allow(unused)] fn main() { enum A { B, C, } impl A { fn new() {} } fn bar(foo: A) { match foo { A::new() => (), // error! _ => {} } } } In this code, an attempt was made to match a non-tuple struct constructor or a non-tuple variant, specifically A::new(), which is an invalid pattern.
Correcting the Code
To fix Rust Error E0164, you need to use only a tuple struct or tuple variant as a pattern in your match expression. Let's correct the code example: #![allow(unused)] fn main() { enum A { B, C, } impl A { fn new() {} } fn bar(foo: A) { match foo { A::B => (), // ok! A::C => (), // ok! _ => {} } } } In this corrected code, both A::B and A::C are tuple variants, making the match expression valid.
Additional Example
Here's another example involving tuple structs: #![allow(unused)] fn main() { struct A(i32, i32); fn bar(foo: A) { match foo { A(x, y) => println!("({}, {})", x, y), // ok! _ => {} } } } In this example, we have a tuple struct A with two fields. The match pattern A(x, y) is valid as it deconstructs the tuple struct into its components.