470 lines
12 KiB
Plaintext
470 lines
12 KiB
Plaintext
================================================================================
|
|
Tuple struct patterns
|
|
================================================================================
|
|
|
|
match x {
|
|
Some(x) => "some",
|
|
std::None() => "none"
|
|
}
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(source_file
|
|
(expression_statement
|
|
(match_expression
|
|
(identifier)
|
|
(match_block
|
|
(match_arm
|
|
(match_pattern
|
|
(tuple_struct_pattern
|
|
(identifier)
|
|
(identifier)))
|
|
(string_literal))
|
|
(match_arm
|
|
(match_pattern
|
|
(tuple_struct_pattern
|
|
(scoped_identifier
|
|
(identifier)
|
|
(identifier))))
|
|
(string_literal))))))
|
|
|
|
================================================================================
|
|
Reference patterns
|
|
================================================================================
|
|
|
|
match x {
|
|
A(ref x) => x.0,
|
|
ref mut y => y,
|
|
& mut z => z,
|
|
}
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(source_file
|
|
(expression_statement
|
|
(match_expression
|
|
(identifier)
|
|
(match_block
|
|
(match_arm
|
|
(match_pattern
|
|
(tuple_struct_pattern
|
|
(identifier)
|
|
(ref_pattern
|
|
(identifier))))
|
|
(field_expression
|
|
(identifier)
|
|
(integer_literal)))
|
|
(match_arm
|
|
(match_pattern
|
|
(ref_pattern
|
|
(mut_pattern
|
|
(mutable_specifier)
|
|
(identifier))))
|
|
(identifier))
|
|
(match_arm
|
|
(match_pattern
|
|
(reference_pattern
|
|
(mutable_specifier)
|
|
(identifier)))
|
|
(identifier))))))
|
|
|
|
================================================================================
|
|
Struct patterns
|
|
================================================================================
|
|
|
|
match x {
|
|
Person{name, age} if age < 5 => ("toddler", name),
|
|
Person{name: adult_name, age: _} => ("adult", adult_name),
|
|
}
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(source_file
|
|
(expression_statement
|
|
(match_expression
|
|
(identifier)
|
|
(match_block
|
|
(match_arm
|
|
(match_pattern
|
|
(struct_pattern
|
|
(type_identifier)
|
|
(field_pattern
|
|
(shorthand_field_identifier))
|
|
(field_pattern
|
|
(shorthand_field_identifier)))
|
|
(binary_expression
|
|
(identifier)
|
|
(integer_literal)))
|
|
(tuple_expression
|
|
(string_literal)
|
|
(identifier)))
|
|
(match_arm
|
|
(match_pattern
|
|
(struct_pattern
|
|
(type_identifier)
|
|
(field_pattern
|
|
(field_identifier)
|
|
(identifier))
|
|
(field_pattern
|
|
(field_identifier))))
|
|
(tuple_expression
|
|
(string_literal)
|
|
(identifier)))))))
|
|
|
|
================================================================================
|
|
Ignored patterns
|
|
================================================================================
|
|
|
|
match x {
|
|
(a, ..) => a,
|
|
B(..) => c,
|
|
D::E{f: g, ..} => g
|
|
}
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(source_file
|
|
(expression_statement
|
|
(match_expression
|
|
(identifier)
|
|
(match_block
|
|
(match_arm
|
|
(match_pattern
|
|
(tuple_pattern
|
|
(identifier)
|
|
(remaining_field_pattern)))
|
|
(identifier))
|
|
(match_arm
|
|
(match_pattern
|
|
(tuple_struct_pattern
|
|
(identifier)
|
|
(remaining_field_pattern)))
|
|
(identifier))
|
|
(match_arm
|
|
(match_pattern
|
|
(struct_pattern
|
|
(scoped_type_identifier
|
|
(identifier)
|
|
(type_identifier))
|
|
(field_pattern
|
|
(field_identifier)
|
|
(identifier))
|
|
(remaining_field_pattern)))
|
|
(identifier))))))
|
|
|
|
================================================================================
|
|
Captured patterns
|
|
================================================================================
|
|
|
|
match x {
|
|
a @ A(_) | b @ B(..) => a,
|
|
a @ 1 ... 5 => a,
|
|
Some(1 ... 5) => a,
|
|
a @ b...c => a,
|
|
a @ b..=c => a,
|
|
}
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(source_file
|
|
(expression_statement
|
|
(match_expression
|
|
value: (identifier)
|
|
body: (match_block
|
|
(match_arm
|
|
pattern: (match_pattern
|
|
(or_pattern
|
|
(captured_pattern
|
|
(identifier)
|
|
(tuple_struct_pattern
|
|
type: (identifier)))
|
|
(captured_pattern
|
|
(identifier)
|
|
(tuple_struct_pattern
|
|
type: (identifier)
|
|
(remaining_field_pattern)))))
|
|
value: (identifier))
|
|
(match_arm
|
|
pattern: (match_pattern
|
|
(captured_pattern
|
|
(identifier)
|
|
(range_pattern
|
|
(integer_literal)
|
|
(integer_literal))))
|
|
value: (identifier))
|
|
(match_arm
|
|
pattern: (match_pattern
|
|
(tuple_struct_pattern
|
|
type: (identifier)
|
|
(range_pattern
|
|
(integer_literal)
|
|
(integer_literal))))
|
|
value: (identifier))
|
|
(match_arm
|
|
pattern: (match_pattern
|
|
(captured_pattern
|
|
(identifier)
|
|
(range_pattern
|
|
(identifier)
|
|
(identifier))))
|
|
value: (identifier))
|
|
(match_arm
|
|
pattern: (match_pattern
|
|
(captured_pattern
|
|
(identifier)
|
|
(range_pattern
|
|
(identifier)
|
|
(identifier))))
|
|
value: (identifier))))))
|
|
|
|
================================================================================
|
|
Or patterns
|
|
================================================================================
|
|
|
|
if let A(x) | B(x) = expr {
|
|
do_stuff_with(x);
|
|
}
|
|
|
|
while let A(x) | B(x) = expr {
|
|
do_stuff_with(x);
|
|
}
|
|
|
|
let Ok(index) | Err(index) = slice.binary_search(&x);
|
|
|
|
for ref a | b in c {}
|
|
|
|
let Ok(x) | Err(x) = binary_search(x);
|
|
|
|
for A | B | C in c {}
|
|
|
|
|(Ok(x) | Err(x))| expr();
|
|
|
|
let ref mut x @ (A | B | C);
|
|
|
|
fn foo((1 | 2 | 3): u8) {}
|
|
|
|
if let x!() | y!() = () {}
|
|
|
|
// Discomment after box pattern land on master
|
|
// let box (A | B | C);
|
|
|
|
// Not handled cause devs didn't got into agreement if should be acceptd or not
|
|
// |Ok(x) | Err(x)| expr();
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(source_file
|
|
(expression_statement
|
|
(if_expression
|
|
condition: (let_condition
|
|
pattern: (or_pattern
|
|
(tuple_struct_pattern
|
|
type: (identifier)
|
|
(identifier))
|
|
(tuple_struct_pattern
|
|
type: (identifier)
|
|
(identifier)))
|
|
value: (identifier))
|
|
consequence: (block
|
|
(expression_statement
|
|
(call_expression
|
|
function: (identifier)
|
|
arguments: (arguments
|
|
(identifier)))))))
|
|
(expression_statement
|
|
(while_expression
|
|
condition: (let_condition
|
|
pattern: (or_pattern
|
|
(tuple_struct_pattern
|
|
type: (identifier)
|
|
(identifier))
|
|
(tuple_struct_pattern
|
|
type: (identifier)
|
|
(identifier)))
|
|
value: (identifier))
|
|
body: (block
|
|
(expression_statement
|
|
(call_expression
|
|
function: (identifier)
|
|
arguments: (arguments
|
|
(identifier)))))))
|
|
(let_declaration
|
|
pattern: (or_pattern
|
|
(tuple_struct_pattern
|
|
type: (identifier)
|
|
(identifier))
|
|
(tuple_struct_pattern
|
|
type: (identifier)
|
|
(identifier)))
|
|
value: (call_expression
|
|
function: (field_expression
|
|
value: (identifier)
|
|
field: (field_identifier))
|
|
arguments: (arguments
|
|
(reference_expression
|
|
value: (identifier)))))
|
|
(expression_statement
|
|
(for_expression
|
|
pattern: (or_pattern
|
|
(ref_pattern
|
|
(identifier))
|
|
(identifier))
|
|
value: (identifier)
|
|
body: (block)))
|
|
(let_declaration
|
|
pattern: (or_pattern
|
|
(tuple_struct_pattern
|
|
type: (identifier)
|
|
(identifier))
|
|
(tuple_struct_pattern
|
|
type: (identifier)
|
|
(identifier)))
|
|
value: (call_expression
|
|
function: (identifier)
|
|
arguments: (arguments
|
|
(identifier))))
|
|
(expression_statement
|
|
(for_expression
|
|
pattern: (or_pattern
|
|
(or_pattern
|
|
(identifier)
|
|
(identifier))
|
|
(identifier))
|
|
value: (identifier)
|
|
body: (block)))
|
|
(expression_statement
|
|
(closure_expression
|
|
parameters: (closure_parameters
|
|
(tuple_pattern
|
|
(or_pattern
|
|
(tuple_struct_pattern
|
|
type: (identifier)
|
|
(identifier))
|
|
(tuple_struct_pattern
|
|
type: (identifier)
|
|
(identifier)))))
|
|
body: (call_expression
|
|
function: (identifier)
|
|
arguments: (arguments))))
|
|
(let_declaration
|
|
pattern: (ref_pattern
|
|
(mut_pattern
|
|
(mutable_specifier)
|
|
(captured_pattern
|
|
(identifier)
|
|
(tuple_pattern
|
|
(or_pattern
|
|
(or_pattern
|
|
(identifier)
|
|
(identifier))
|
|
(identifier)))))))
|
|
(function_item
|
|
name: (identifier)
|
|
parameters: (parameters
|
|
(parameter
|
|
pattern: (tuple_pattern
|
|
(or_pattern
|
|
(or_pattern
|
|
(integer_literal)
|
|
(integer_literal))
|
|
(integer_literal)))
|
|
type: (primitive_type)))
|
|
body: (block))
|
|
(expression_statement
|
|
(if_expression
|
|
condition: (let_condition
|
|
pattern: (or_pattern
|
|
(macro_invocation
|
|
macro: (identifier)
|
|
(token_tree))
|
|
(macro_invocation
|
|
macro: (identifier)
|
|
(token_tree)))
|
|
value: (unit_expression))
|
|
consequence: (block)))
|
|
(line_comment)
|
|
(line_comment)
|
|
(line_comment)
|
|
(line_comment))
|
|
|
|
================================================================================
|
|
Inline const or Const blocks as pattern
|
|
================================================================================
|
|
|
|
fn foo(x: i32) {
|
|
const CUBE: i32 = 3.pow(3);
|
|
match x {
|
|
CUBE => println!("three cubed"),
|
|
_ => {}
|
|
}
|
|
}
|
|
|
|
fn foo(x: i32) {
|
|
match x {
|
|
const { 3.pow(3) } => println!("three cubed"),
|
|
_ => {}
|
|
}
|
|
}
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(source_file
|
|
(function_item
|
|
name: (identifier)
|
|
parameters: (parameters
|
|
(parameter
|
|
pattern: (identifier)
|
|
type: (primitive_type)))
|
|
body: (block
|
|
(const_item
|
|
name: (identifier)
|
|
type: (primitive_type)
|
|
value: (call_expression
|
|
function: (field_expression
|
|
value: (integer_literal)
|
|
field: (field_identifier))
|
|
arguments: (arguments
|
|
(integer_literal))))
|
|
(expression_statement
|
|
(match_expression
|
|
value: (identifier)
|
|
body: (match_block
|
|
(match_arm
|
|
pattern: (match_pattern
|
|
(identifier))
|
|
value: (macro_invocation
|
|
macro: (identifier)
|
|
(token_tree
|
|
(string_literal))))
|
|
(match_arm
|
|
pattern: (match_pattern)
|
|
value: (block)))))))
|
|
(function_item
|
|
name: (identifier)
|
|
parameters: (parameters
|
|
(parameter
|
|
pattern: (identifier)
|
|
type: (primitive_type)))
|
|
body: (block
|
|
(expression_statement
|
|
(match_expression
|
|
value: (identifier)
|
|
body: (match_block
|
|
(match_arm
|
|
pattern: (match_pattern
|
|
(const_block
|
|
body: (block
|
|
(call_expression
|
|
function: (field_expression
|
|
value: (integer_literal)
|
|
field: (field_identifier))
|
|
arguments: (arguments
|
|
(integer_literal))))))
|
|
value: (macro_invocation
|
|
macro: (identifier)
|
|
(token_tree
|
|
(string_literal))))
|
|
(match_arm
|
|
pattern: (match_pattern)
|
|
value: (block))))))))
|