μΌ | μ | ν | μ | λͺ© | κΈ | ν |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- data communication
- λ°±μ€
- νμ΄μ¬
- νμ΄μ¬ μ±λ¦°μ§
- μλ° κΈ°μ΄
- Python challenge
- λ¬μ€νΈ
- λ¬μ€νΈ μμ
- Rust
- μλ°
- μ΄μ체μ
- Operating System
- νμ΄μ¬ μ²Όλ¦°μ§
- C
- λ°μ΄ν° ν΅μ
- λ¬μ€νΈ νλ‘κ·Έλλ° κ³΅μ κ°μ΄λ
- OS
- Python
- λ°μ΄ν°λ² μ΄μ€
- μ€λΌν΄DB
- Reversing
- νμ΄μ¬ μκ³ λ¦¬μ¦
- μλ° κ°λ
- μ°λΆν¬
- μ€λΌν΄
- ubuntu
- Database
- μκ³ λ¦¬μ¦
- λ°±μ€ λ¬μ€νΈ
- java
Archives
- Today
- Total
IT’s Portfolio
[Rust] Start Rust (Day 11) - Enums and Pattern Matching [1] λ³Έλ¬Έ
Development Study/Rust
[Rust] Start Rust (Day 11) - Enums and Pattern Matching [1]
f1r3_r41n 2023. 2. 3. 15:26728x90
λ°μν
π¦ Rust Day 11
π³οΈ Enums and Pattern Matching
μ΄κ±°μ(enumerations, enums)
λ μ¬μ© κ°λ₯ν κ°λ§ λμ΄ν νμ μ μ μν λ μ¬μ©- ν¨ν΄ 맀μΉμ μ΄κ±°μκ° κ°μ§ μ¬λ¬ κ°μ λν΄ κ°κΈ° λ€λ₯Έ μ½λλ₯Ό μ½κ² μ€νν μ μλ λ°©λ²
- λ¬μ€νΈμ μ΄κ±°μλ F#, OCaml, νμ€μΌ(Haskell) κ³Ό κ°μ ν¨μν μΈμ΄μ
λμμ(algebraic)
λ°μ΄ν° νμ μ λ κ°κΉμ
1οΈβ£ μ΄κ±°μ μ μνκΈ°
- IP μ£Όμλ λ²μ 4λ λ²μ 6 νμμ μ£Όμμ§λ§ λμμ λ νμμ μ§μν μ μμ
- μ΄λ¬ν IP μ£Όμμ νΉμ§ λλΆμ ꡬ쑰체보λ€λ μ΄κ±°μ λ°μ΄ν° ꡬ쑰λ₯Ό μ μ©νλ κ²μ΄ μ ν©ν¨
- μ΄κ±°μμ λμ΄ν κ°μ λ°λμ νλλ§ μ¬μ©ν μ μμ
enum IpAddrKind {
V4,
V6,
}
- IP μ£Όμμ νμμ λνλ΄λ
IPAddrKind
μ΄κ±°μ μ μ ν κ° νμμ νννκΈ° μνV4
μV6
κ° μ μ- ν΄λΉ κ°λ€μ μ΄κ±°μμ
μ΄κ²κ°(variants)
μ΄λΌκ³ μΉν¨ IpAddrKind
μ΄κ±°μλ μ΄μ μ½λμμ μ¬μ©ν μ μλ νλμ νμ μΌλ‘ κ°μ£Όλ¨
- ν΄λΉ κ°λ€μ μ΄κ±°μμ
π€ μ΄κ±°μμ κ°
let ipv4_1 = IpAddrKind::V4;
let ipv6_1 = IpAddrKind::V6;
- μ΄κ±°μμ κ° κ°μ νννλ μΈμ€ν΄μ€
- μ΄κ±°μμ κ° κ°μ μλ³μλ₯Ό μ΄μ©ν΄ ꡬλΆν¨
- μλ³μμ κ°μ
::
λ¬Έλ²μΌλ‘ ꡬλΆ
- μλ³μμ κ°μ
fn route(ip_type: IpAddrKind) { }
- μ΄κ±°μλ₯Ό 맀κ°λ³μλ‘ κ°λ ν¨μλ μ μν μ μμ
enum IpAddrKind {
V4,
V6,
}
struct IpAddr {
kind: IpAddrKind,
address: String,
}
fn main() {
let home = IpAddr {
kind: IpAddrKind::V4,
address: String::from("127.0.0.1"),
};
let switch = IpAddr {
kind: IpAddrKind::V6,
address: String::from("::1"),
};
println!("{}\n{}", home.address, switch.address);
}
// Result
// 127.0.0.1
// ::1
- ꡬ쑰체λ₯Ό μ΄μ©ν΄ IP μ£Όμμ μ’ λ₯μ λ°μ΄ν°λ₯Ό μ μ₯ν¨
IpAddr
ꡬ쑰체 μ μ νIpAddrKind
μ΄κ±°μ νμ μkind
νλ,String
νμ μaddress
νλ μ μ- ꡬ쑰체λ₯Ό μ΄μ©ν΄ IP μ£Όμμ μ’ λ₯μ μ€μ μ£Όμλ₯Ό νλλ‘ λ¬ΆμκΈ° λλ¬Έμ μ΄κ±°μμ κ°κ³Ό κ΄λ ¨λ κ°μ νλλ‘ μ²λ¦¬ν μ μμ
#[derive(Debug)]
enum IpAddrKind {
V4(String),
V6(String),
}
fn main() {
let home = IpAddrKind::V4(
String::from("127.0.0.1")
);
let switch = IpAddrKind::V6(
String::from("::1")
);
println!("{:?}\n{:?}", home, switch);
}
// Result
// V4("127.0.0.1")
// V6("::1")
- λ°μ΄ν°λ₯Ό μ΄κ±°μμ μ΄κ²κ°μ μ§μ μ μ₯νμ¬ ννν¨
IpAddr
μ΄κ±°μλV4
μV6
κ°μ μ μνλ©΄μ μ°κ΄λ κ°μ νμ μString
νμ μΌλ‘ λͺ μ- λ³λμ ꡬ쑰체λ₯Ό μ μΈν νμκ° μμ
#[derive(Debug)]
enum IpAddrKind {
V4(u8, u8, u8, u8),
V6(String),
}
fn main() {
let home = IpAddrKind::V4(
127, 0, 0, 1
);
let switch = IpAddrKind::V6(
String::from("::1")
);
println!("{:?}\n{:?}", home, switch);
}
// Result
// V4(127, 0, 0, 1)
// V6("::1")
- μ΄κ±°μμ λμ΄λ κ°κ°μ κ°μ μλ‘ λ€λ₯Έ νμ κ³Ό λ€λ₯Έ μμ μ°κ΄ λ°μ΄ν°λ₯Ό 보μ ν μ μμ
V4
νμμ μ£Όμμ λ€ κ°μu8
κ°μ μ μ₯,V6
νμμ μ£Όμλ κ·Έλλ‘String
νμ- ꡬ쑰체λ‘λ μ΄λ° λ°μ΄ν° ꡬ쑰λ₯Ό κ°μΆ μ μμ
- μ΄κ±°μμ κ°μλ λ¬Έμμ΄, μ«μ, ꡬ쑰체 λ± μ΄λ€ μ’
λ₯μ λ°μ΄ν° λ μ μ₯ν μ μμ
- λ€λ₯Έ μ΄κ±°μλ₯Ό μ μ₯ν΄λ 무방ν¨
- νμ€ λΌμ΄λΈλ¬λ¦¬μ μ΄κ±°μκ° μ μλμ΄ μλ€κ³ ν΄λ νμ€ λΌμ΄λΈλ¬λ¦¬μ μ μν νμ μ μ½λμ λ²μλ‘ κ°μ Έμ€μ§ μλ ν μλ¬΄λ° λ¬Έμ μμ΄ κ°μ μ΄λ¦μ νμ μ μ¬μ μν μ μμ
enum Message {
Quit,
Move { x: i32, y: i32 },
Write(String),
ChangeColor(i32, i32, i32)
}
- κ°λ³ κ°μ κ°κΈ° λ€λ₯Έ νμ
μΌλ‘ μ μν
Message
μ΄κ±°μQuit
: μ°κ΄ λ°μ΄ν°λ₯Ό κ°μ§ μμMove
:μ΅λͺ ꡬ쑰체(anonymous struct)
ν¬ν¨Write
: νλμString
κ° ν¬ν¨ChangeColor
: μΈ κ°μi32
κ° ν¬ν¨- κ°κΈ° λ€λ₯Έ ꡬ쑰체 νμ
μ μ μνλ κ²κ³Ό μ μ¬ν¨
- λ€λ₯Έμ 1.
struct
keywordλ₯Ό μ¬μ©νμ§ μμ - λ€λ₯Έμ 2. μ΄κ±°μμ κ°λ³ κ°λ€μ λͺ¨λ μ΄κ±°μ νμ μ μν¨
- λ€λ₯Έμ 1.
struct QuitMsg; // μ λ ꡬ쑰체
struct MoveMsg {
x: i32,
y: i32,
}
struct WriteMsg(String); // νν ꡬ쑰체
struct ChangeColorMsg(i32, i32, i32); // νν ꡬ쑰체
Message
μ΄κ±°μμ κ°μ λ°μ΄ν°λ₯Ό μ μ₯νλλ‘ μ μν ꡬ쑰체- λ€λ₯Έ νμ μ ꡬ쑰체λ₯Ό μ μνκ² λλ©΄ μ¬λ¬ μ’ λ₯μ λ©μμ§λ₯Ό 맀κ°λ³μλ‘ μ λ¬λ°λ ν¨μλ₯Ό μ½κ² μ μν μ μμ
#[derive(Debug)]
enum Message {
Quit,
Move { x: i32, y: i32 },
Write(String),
ChangeColor(i32, i32, i32)
}
impl Message {
fn call(&self) {
println!("{:?}", self);
}
}
fn main() {
let msg = Message::Write(
String::from("Hello, world!")
);
msg.call();
}
// Result
// Write("Hello, world!")
impl
λΈλ‘μ μ΄μ©νμ¬ μ΄κ±°μμ λ©μλλ₯Ό μ μν¨self
keywordλ‘ λ©μλλ₯Ό νΈμΆνλ μ΄κ±°μμ κ°μ κ°μ Έμ¬ μ μμ
π€ Option
μ΄κ±°μλ₯Ό Null
κ° λμ μ¬μ©ν λμ μ₯μ
Option
νμ μ λ§€μ° λ€μν κ³³μμ νμ© κ°λ₯- μ΄λ€ κ°μ΄ μ‘΄μ¬νκ±°λ μ‘΄μ¬νμ§ μλ, μμ£Ό λ²μ©μ μΈ μλ리μ€μ μ ν©νλλ‘ λμμΈλμκΈ° λλ¬Έ
- νμ μμ€ν μ΄ μ΄λ° νμ μ μ 곡νλ€λ κ²μ μ½λκ° λͺ¨λ κ²½μ°μ μλ₯Ό μ²λ¦¬νκ³ μλμ§λ₯Ό μ»΄νμΌλ¬κ° νμΈν μ μλ€λ κ²μ μλ―Έ
- λ¬μ€νΈλ λ€λ₯Έ μΈμ΄κ° κ°μ§κ³ μλ
λ(null)
μ΄λΌλ κ°μ κ°λ μ΄ μμλκ°
: μλ¬΄λ° κ°μ κ°μ§ μλ κ²½μ°λ₯Ό μλ―Έλκ°
μ μ§μνλ μΈμ΄μμ λ³μλ νμλ
μ΄κ±°λλμ΄ μλ(not-null)
λ κ°μ§ μν μ€ νλμ
λκ°
μ λ¬Έμ μ μλκ°
μλμ΄ μλ κ°
μ²λΌ μ¬μ©νλ €κ³ νλ©΄ μλ¬κ° λ°μνλ€λ μ μ- λ¬μ€νΈλ μ΄λ€ κ°μ μ‘΄μ¬ μ¬λΆλ₯Ό νννλ μ΄κ±°μλ₯Ό μ μνκ³ μμ
- π
Option<T>
Option<T>
μ΄κ±°μλprelude
μ ν¬ν¨λμ΄ μκΈ°μ μ΄κ²κ°λ ν¨κ» λͺ μμ μΌλ‘ λ²μλ₯Ό κ°μ Έμ¬ νμκ° μμOption::
μ λμ΄ μμ΄Some
μ΄λNone
κ° μ¬μ© κ°λ₯- preludeμ λν 곡μ λ¬Έμ
- λ¬μ€νΈμ
<T>
λ¬Έλ²μμ λ€λ¦(generic)
νμ μ 맀κ°λ³μλ₯Ό μλ―Έ<T>
맀κ°λ³μ λλΆμOption
μ΄κ±°μμSome
κ°μ μ΄λ€ νμ μ λ°μ΄ν°λ μ μ₯μ΄ κ°λ₯ν¨- Ex1.
let num = Some(5);
$=>$ μ«μ νμ - Ex2.
let msg = Some("Hello, world!");
$=>$ λ¬Έμμ΄ νμ Some
λμNone
κ°μ μ΄μ©νλ©΄Option<T>
μ΄κ±°μ νμ μ λͺ μν΄μΌ ν¨- Ex1.
let null_num: Option<i32> = None;
Option<T>
μT
λ λ€λ₯Έ νμ μ΄κΈ° λλ¬Έμ μ»΄νμΌλ¬λ μ ν¨ν κ°μ΄ λͺ νν μ‘΄μ¬ν λλOption<T>
κ°μ μ¬μ©νλ κ²μ νλ½νμ§ μμi8
νμ μ κ°μ κ°κ³ μλ€λ©΄ μ΄ κ°μ νμ μ ν¨ν κ°μ΄λΌ κ°μ νκΈ° λλ¬Έμ μ΄ κ°μ μ¬μ©νκΈ° μ μ λ κ²μ¬ κ°μ κ²μ ν νμκ° μμOption<i8>
νμ μ μ¬μ©ν λλ§ μ΄ λ³μμ κ°μ΄ μμ κ°λ₯μ±μ΄ μκΈ°μ μ¬μ©μ μμ κ°μ΄ μλ κ²½μ°λ₯Ό μ²λ¦¬νλ €κ³ ν¨
T
νμ μ λν μμ μ€ν μ μOption<T>
νμ μT
νμ μΌλ‘ λ³νν΄μΌ ν¨
// νμ€ λΌμ΄λΈλ¬λ¦¬μμ Option<T>μ μ μ enum Option<T> { Some(T), None, }
- μ΄λ€ κ°μ΄
λκ°
μ κ°μ§ μ μλλ‘ νλ €λ©΄Option<T>
νμ λͺ μ - κ°μ μ¬μ©νκ³ μ νλ©΄ μ΄ κ°μ΄ λμΈ κ²½μ°λ₯Ό λ°λμ λͺ μμ μΌλ‘ μ²λ¦¬
Option<T>
κ° μλ λ€λ₯Έ νμ μ κ°μ μ¬μ©νλ κ²½μ°λΌλ©΄ μ΄ κ°μ λμ΄ μλ κ²μΌλ‘ μκ°ν΄λ 무방Option<T>
μ λ€μν λ©μλ in Official Document- ν΅μ
Option<T>
κ°μ μ¬μ©νλ €λ©΄ μ΄κ±°μμ λμ΄λ κ°λ³ κ°μ μ²λ¦¬ν μ½λλ₯Ό μμ±ν΄μΌ ν¨match
ννμμ μ¬μ©ν΄ μ½κ² ꡬν κ°λ₯- (1).
Some(T)
κ°μ κ°μ§ κ²½μ°λ§ μ€ν -> μ΄κ±°μ μμ μ μ₯λT
μ κ°μ μ κ·Όν μ μμ - (2).
None
κ°μ κ°μ§ κ²½μ°μ μ€ν ->T
κ°μ μ κ·Ό λΆκ°λ₯
- (1).
728x90
λ°μν
'Development Study > Rust' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Algorithm] Baekjoon - μ μΆλ ₯κ³Ό μ¬μΉμ°μ° λ¨κ³ (3) | 2023.02.10 |
---|---|
[Rust] Start Rust (Day 12) - Enums and Pattern Matching [2] (2) | 2023.02.06 |
[Rust] Start Rust (Day 10) - Using Structs to Structure Related Data (4) | 2023.02.01 |
[Rust] Start Rust (Day 9) - Understanding Ownership (3) | 2023.01.24 |
[Rust] Start Rust (Day 8) - Rust Example Script 2 [Nth in Fibonacci Sequence] (0) | 2023.01.18 |
Comments