수색…
통사론
- _ 와일드 카드 패턴, ¹ 일치하는 항목 ¹
- ident // 바인딩 패턴. 아무것도 일치하고 ident ¹에 바인딩합니다.
- ident @ pat // 위와 동일하지만 바인딩 된 내용을 더 일치시킬 수 있습니다.
- ref ident // 바인딩 패턴은 무엇이든 일치시키고 참조 ident에 바인딩합니다 .¹
- ref mut ident // 바인딩 패턴, 아무것도 일치하는 문자열을 변경할 수있는 참조 식별자 ¹에 바인딩합니다.
- & pat //는 참조와 일치합니다 (따라서 pat 은 참조가 아니라 심판입니다) ¹
- & mut pat // 위와 같이 변경 가능한 참조로 ¹
- CONST // 명명 된 상수와 일치합니다.
- Struct { field1 , field2 } // 구조 값과 일치하고 해체합니다. 필드 에 대한 참고 사항 ¹을 참조하십시오 .¹
- EnumVariant // 열거 형 변형과 일치합니다.
- EnumVariant ( pat1 , pat2 ) // 열거 형과 일치하는 매개 변수를 찾습니다.
- EnumVariant ( pat1 , pat2 , .., patn ) // 위와 동일하지만 첫 번째 매개 변수, 두 번째 매개 변수 및 마지막 매개 변수를 제외한 모든 매개 변수를 건너 뜁니다.
- ( pat1 , pat2 ) // 튜플과 해당 요소를 일치 시킵니다 .¹
- ( pat1 , pat2 , .., patn ) // 위와 동일하지만 첫 번째, 두 번째 및 마지막 요소를 제외하고 모두 건너 뜁니다 .¹
- lit // 리터럴 상수와 일치합니다 (char, 숫자 유형, 부울 및 문자열)
- pat1 ... pat2 // 해당 범위의 값과 일치 (char 및 numeric 유형)
비고
구조 값을 해체 할 때 필드는 field_name
또는 field_name : pattern
형식이어야합니다. 패턴을 지정하지 않으면 암시 적 바인딩이 수행됩니다.
let Point { x, y } = p; // equivalent to let Point { x: x, y: y } = p; let Point { ref x, ref y } = p; // equivalent to let Point { x: ref x, y: ref y } = p;
1 : 반박 가능한 패턴
바인딩과 일치하는 패턴
@
사용하여 이름에 값을 바인딩 할 수 있습니다.
struct Badger {
pub age: u8
}
fn main() {
// Let's create a Badger instances
let badger_john = Badger { age: 8 };
// Now try to find out what John's favourite activity is, based on his age
match badger_john.age {
// we can bind value ranges to variables and use them in the matched branches
baby_age @ 0...1 => println!("John is {} years old, he sleeps a lot", baby_age),
young_age @ 2...4 => println!("John is {} years old, he plays all day", young_age),
adult_age @ 5...10 => println!("John is {} years old, he eats honey most of the time", adult_age),
old_age => println!("John is {} years old, he mostly reads newspapers", old_age),
}
}
그러면 다음과 같이 인쇄됩니다.
John is 8 years old, he eats honey most of the time
기본 패턴 매칭
// Create a boolean value
let a = true;
// The following expression will try and find a pattern for our value starting with
// the topmost pattern.
// This is an exhaustive match expression because it checks for every possible value
match a {
true => println!("a is true"),
false => println!("a is false")
}
모든 경우를 다루지 않으면 컴파일러 오류가 발생합니다.
match a {
true => println!("most important case")
}
// error: non-exhaustive patterns: `false` not covered [E0004]
기본 / 와일드 카드의 경우 _
를 사용할 수 있으며 모든 것을 일치시킵니다.
// Create an 32-bit unsigned integer
let b: u32 = 13;
match b {
0 => println!("b is 0"),
1 => println!("b is 1"),
_ => println!("b is something other than 0 or 1")
}
이 예제에서는 다음을 인쇄합니다.
a is true
b is something else than 0 or 1
여러 패턴 매치
|
여러 개의 별개 값을 동일한 방법으로 처리 할 수 있습니다. :
enum Colour {
Red,
Green,
Blue,
Cyan,
Magenta,
Yellow,
Black
}
enum ColourModel {
RGB,
CMYK
}
// let's take an example colour
let colour = Colour::Red;
let model = match colour {
// check if colour is any of the RGB colours
Colour::Red | Colour::Green | Colour::Blue => ColourModel::RGB,
// otherwise select CMYK
_ => ColourModel::CMYK,
};
가드와의 조건부 패턴 매칭
패턴의 값에 독립적 인 값에 기초하여 매칭 될 수는 사용되는 유사한 if
경비 :
// Let's imagine a simplistic web app with the following pages:
enum Page {
Login,
Logout,
About,
Admin
}
// We are authenticated
let is_authenticated = true;
// But we aren't admins
let is_admin = false;
let accessed_page = Page::Admin;
match accessed_page {
// Login is available for not yet authenticated users
Page::Login if !is_authenticated => println!("Please provide a username and a password"),
// Logout is available for authenticated users
Page::Logout if is_authenticated => println!("Good bye"),
// About is a public page, anyone can access it
Page::About => println!("About us"),
// But the Admin page is restricted to administators
Page::Admin if is_admin => println!("Welcome, dear administrator"),
// For every other request, we display an error message
_ => println!("Not available")
}
그러면 "사용할 수 없음" 이 표시됩니다.
let / while이라면 let
if let
패턴 match
와 if
문을 결합하여 간단히 비 포괄적 인 일치를 수행 할 수 있습니다.
if let Some(x) = option {
do_something(x);
}
이것은 다음과 같습니다.
match option {
Some(x) => do_something(x),
_ => {},
}
이 블록에는 else
문도있을 수 있습니다.
if let Some(x) = option {
do_something(x);
} else {
panic!("option was None");
}
이 블록은 다음과 같습니다.
match option {
Some(x) => do_something(x),
None => panic!("option was None"),
}
while let
패턴 일치와 while 루프를 결합합니다.
let mut cs = "Hello, world!".chars();
while let Some(x) = cs.next() {
print("{}+", x);
}
println!("");
이것은 H+e+l+l+o+,+ +w+o+r+l+d+!+
합니다.
loop {}
와 match
문을 사용하는 것과 같습니다.
let mut cs = "Hello, world!".chars();
loop {
match cs.next() {
Some(x) => print("{}+", x),
_ => break,
}
}
println!("");
패턴에서 참조 추출하기
때로는 참조 만 사용하여 객체에서 값을 추출 할 수 있어야합니다 (즉, 소유권을 이전하지 않고).
struct Token {
pub id: u32
}
struct User {
pub token: Option<Token>
}
fn main() {
// Create a user with an arbitrary token
let user = User { token: Some(Token { id: 3 }) };
// Let's borrow user by getting a reference to it
let user_ref = &user;
// This match expression would not compile saying "cannot move out of borrowed
// content" because user_ref is a borrowed value but token expects an owned value.
match user_ref {
&User { token } => println!("User token exists? {}", token.is_some())
}
// By adding 'ref' to our pattern we instruct the compiler to give us a reference
// instead of an owned value.
match user_ref {
&User { ref token } => println!("User token exists? {}", token.is_some())
}
// We can also combine ref with destructuring
match user_ref {
// 'ref' will allow us to access the token inside of the Option by reference
&User { token: Some(ref user_token) } => println!("Token value: {}", user_token.id ),
&User { token: None } => println!("There was no token assigned to the user" )
}
// References can be mutable too, let's create another user to demonstrate this
let mut other_user = User { token: Some(Token { id: 4 }) };
// Take a mutable reference to the user
let other_user_ref_mut = &mut other_user;
match other_user_ref_mut {
// 'ref mut' gets us a mutable reference allowing us to change the contained value directly.
&mut User { token: Some(ref mut user_token) } => {
user_token.id = 5;
println!("New token value: {}", user_token.id )
},
&mut User { token: None } => println!("There was no token assigned to the user" )
}
}
다음과 같이 출력합니다 :
User token exists? true
Token value: 3
New token value: 5
Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow