Warning μμ±μ€μΈ κΈμ λλ€. λ΄μ©μ μμ μ΄ μμ μ μμ΅λλ€.
Rust λ¬Έλ² μ 리
Rustλ§μ λ νΉν νΉμ§λ€μ΄ μλ€.
null
ν¬μΈν°κ° μμ[1] μμ ν λ¬μ€νΈμμ λ©λͺ¨λ¦¬ λμλ₯Ό μΌμΌν€λ κ²μ κΈ°μ μ μΌλ‘ κ°λ₯ν¨.
Box::leak
λ©μλλ₯Ό μ¬μ©νλ©΄, μλ©Έμλ₯Ό μ€ννμ§ μκ³ μμ μ°Έμ‘°λ₯Ό κ°μ Έμ€κ³ , μ΄νμ μ΄λ₯Ό μμ ν μ μμ. μμ ν λ¬μ€νΈμμ λμλ₯Ό λ§λλ λ§μ λ€λ₯Έ λ°©λ²λ€μ΄ μμ§λ§, "λ©λͺ¨λ¦¬ λμ μμ" μ "μ°λ°μ μΈ λ©λͺ¨λ¦¬ λμκ° κ±°μ μμ" μΌλ‘ μ΄ν΄ν΄μΌν¨.
[2] λ©λͺ¨λ¦¬λ₯Ό λλ² ν΄μ νλ κ²
[3] λ©λͺ¨λ¦¬ freeν λ€μ μ¬μ©νλ κ²
[4] λ©ν° μ°λ λλ₯Ό μ¬μ©νλ νκ²½μμ κ°μ λ°μ΄ν°λ₯Ό μ΄μ©νκ³ λ€λ₯Έ μ°λ λμμ κ·Έκ²μ μ λ°μ΄νΈνλ©΄ μκΈ°λ μΌ
[5] https://www.geeksforgeeks.org/iterator-invalidation-cpp/ μ°Έκ³
μμμΉ λͺ»ν λμμ΄ μΌμ΄λμ§ μμ
Types | Literals | |
---|---|---|
Signed integers | i8 , i16 , i32 , i64 , i128 , isize | -10 , 0 , 1_000 , 123i64 |
Unsigned integers | u8 , u16 , u32 , u64 , u128 , usize | 0 , 123 , 10u16 |
Floating point numbers | f32 , f64 | 3.14 , -10.0e20 , 2f32 |
Strings | &str | "foo" , r#"\\"# |
Unicode scalar values | char | 'a' , 'Ξ±' , 'β' |
Byte strings | &[u8] | b"abc , br#" " " "# |
Booleans | bool | true , false |
νμ λ€μ λλΉλ λ€μκ³Ό κ°μ:
iN
, uN
, λ° fN
μ N-bit widthμisize
μ usize
λ ν¬μΈν°μ ν¬κΈ°μchar
μ 32bit λλΉbool
μ 8λΉνΈ λλΉTypes | Literals | |
---|---|---|
Arrays | [T; N] | [20, 30, 40], [0; 3] |
Tuples | (T1, T2, T3, ...) | ('x', 1.2, 0) |
fn main() {
let mut a: [i8; 10] = [42; 10];
a[5] = 0;
println!("a: {:?}", a);
}
fn main() {
let t: (i8, bool) = (7, true);
println!("1st index: {}", t.0);
println!("2nd index: {}", t.1);
}
C++κ³Ό κ°μ΄, Rustμλ μ°Έμ‘°κ° μμ.
fn main() {
let mut x: i32 = 10;
let ref_x: &mut i32 = &mut x;
*ref_x = 20;
println!("x: {x}");
}
C++κ³Όμ μ°¨μ΄μ
- C ν¬μΈν°μ λΉμ·νκ²
ref_x
λ₯Ό ν λΉν λ μμ°Έμ‘°ν΄μΌν¨.- Rustλ λͺλͺ κ²½μ°μ μλμΌλ‘ μμ°Έμ‘°λ₯Ό ν¨.
Rustλ νμ μ°Έμ‘°λ₯Ό[6] μ μ μΌλ‘ κΈμ§ν¨.
fn main() {
let ref_x: &i32;
{
let x: i32 = 10;
ref_x = &x;
}
println!("ref_x: {ref_x}");
}
Compiling playground v0.0.1 (/playground)
error[E0597]: `x` does not live long enough
--> src/main.rs:5:17
|
5 | ref_x = &x;
| ^^ borrowed value does not live long enough
6 | }
| - `x` dropped here while still borrowed
7 | println!("ref_x: {ref_x}");
| ----- borrow later used here
For more information about this error, try `rustc --explain E0597`.
error: could not compile `playground` due to previous error
[6] ν¬μΈν°κ° μ¬μ ν ν΄μ λ μμμ κ°λ¦¬ν€κ³ μλ κ²
[7] λΉλ €μ¨λ€
μ¬λΌμ΄μ€λ λ ν° Collection μμ λ³Ό μ μκ² ν΄μ€λ€.
fn main() {
let a: [i32; 6] = [10, 20, 30, 40, 50, 60];
println!("a: {a:?}");
let s: &[i32] = &a[2..4];
println!("s: {s:?}");
}
μ¬λΌμ΄μ€λ μ¬λΌμ΄μ€λ νμ
μμ λ°μ΄ν°λ₯Ό μ°¨μ©ν΄μ¨λ€. κ·Έλ λ€λ©΄ a[3]
λ₯Ό λ³κ²½νλ©΄ μ΄λ»κ² λ κΉ? s
κ° λ°λκΉ? λ΅μ λ°κΏ μ μλ€. μΌλ¨, λ°°μ΄ a
λ λΆλ³μ΄λ€. κ·Έλ λ€λ©΄ let mut a: [i32; 6]
μΌλ‘ μ μΈνλ©΄ κ°λ₯ν κΉ? λ°°μ΄ s
λ νμ¬ a
μ κ°μ μ°¨μ©νκ³ μλ€. μ°λ¦¬λ λ€λ₯Έ λ³μλ ν¨μκ° λΉλ €κ° κ°μλ κ°μ ν λΉν μ μλ€.
Compiling playground v0.0.1 (/playground)
error[E0506]: cannot assign to `a[_]` because it is borrowed
--> src/main.rs:6:5
|
5 | let s: &[i32] = &a[2..4];
| - borrow of `a[_]` occurs here
6 | a[3] = 90;
| ^^^^^^^^^ assignment to borrowed `a[_]` occurs here
7 | println!("s: {s:?}");
| - borrow later used here
For more information about this error, try `rustc --explain E0506`.
error: could not compile `playground` due to previous error
λ¬μ€νΈμλ λκ°μ§ λ¬Έμμ΄ νμ
μ΄ μλ€: &str
, String
fn main() {
let s1: &str = "Hello";
println!("s1: {s1}");
let mut s2: String = String::from("Hello ");
println!("s2: {s2}");
s2.push_str(s1);
println!("s2: {s2}");
}
/*
s1: Hello
s2: Hello
s2: Hello Hello
*/
&str
μ λ¬Έμμ΄ μ¬λΌμ΄μ€μ λν λΆλ³ν μ°Έμ‘°μ΄λ€.String
μ κ°λ³ λ¬Έμμ΄ λ²νΌμ΄λ€.λ€μμ Fizz BuzzλΌλ κ²μμ λ¬μ€νΈ μ½λμ΄λ€.
fn main() {
fizzbuzz_to(20); // Defined below, no forward declaration needed
}
fn is_divisible_by(lhs: u32, rhs: u32) -> bool {
if rhs == 0 {
return false; // Corner case, early return
}
lhs % rhs == 0 // The last expression is the return value
}
fn fizzbuzz(n: u32) -> () { // No return value means returning the unit type `()`
match (is_divisible_by(n, 3), is_divisible_by(n, 5)) {
(true, true) => println!("fizzbuzz"),
(true, false) => println!("fizz"),
(false, true) => println!("buzz"),
(false, false) => println!("{n}"),
}
}
fn fizzbuzz_to(n: u32) { // `-> ()` is normally omitted
for n in 1..=n {
fizzbuzz(n);
}
}
()
λ₯Ό λ°ννλ€.-> ()
λ μ°μ§ μμλ λλ€.λ¬μ€νΈμλ λ©μλκ° μλ€. κ·Έλ€μ νΉμ νμ κ³Ό κ΄λ ¨λ λ¨μν ν¨μμ΄λ€. λ©μλμ 첫 λ²μ§Έ μΈμλ λ©μλμ κ΄λ ¨λ νμ μ μΈμ€ν΄μ€μ΄λ€.
struct Rectangle {
width: u32,
height: u32,
}
impl Rectangle {
fn area(&self) -> u32 {
self.width * self.height
}
fn inc_width(&mut self, delta: u32) {
self.width += delta;
}
}
fn main() {
let mut rect = Rectangle { width: 10, height: 5 };
println!("old area: {}", rect.area());
rect.inc_width(5);
println!("new area: {}", rect.area());
}
Rustλ μ€λ²λ‘λ©μ μ§μνμ§ μλλ€.
νμ§λ§, ν¨μμ 맀κ°λ³μλ μ λ€λ¦μΌ μ μλ€.
fn pick_one<T>(a: T, b: T) -> T {
if std::process::id() % 2 == 0 { a } else { b }
}
fn main() {
println!("coin toss: {}", pick_one("heads", "tails"));
println!("cash prize: {}", pick_one(500, 1000));
}
Rustλ νμ κ° μμμ λ³νμ μλμΌλ‘ μ μ©νμ§ μλλ€. κ·Έλ κΈ°μ λ€μκ³Ό κ°μ νλ‘κ·Έλ¨μ μλνμ§ μλλ€.
fn multiply(x: i16, y: i16) -> i16 {
x * y
}
fn main() {
let x: i8 = 15;
let y: i16 = 1000;
println!("{x} * {y} = {}", multiply(x, y)); // error
}
Rustμ μ μ νμ
λ€μ λͺ¨λ From<T>
μ Into<T>
traitμ ꡬννμ¬ μ°λ¦¬κ° κ·Έλ€κ°μ λ³νμ ν μ μκ² λμ΄λ€. From<T>
traitμ from()
λ©μλλ₯Ό κ°κ³ μκ³ , μ΄μ λΉμ·νκ² Into<T>
traitμ into()
λ©μλλ₯Ό κ°μ§κ³ μλ€. μ΄λ¬ν traitλ€μ ꡬννλ κ²μ μ΄λ»κ² νμ
λ€μ΄ κ·Έλ€μ΄ λ€λ₯Έ νμ
λ€λ‘ λ³νλ μ μλμ§ λ³΄μ¬μ€λ€.
νμ€ λΌμ΄λΈλ¬λ¦¬μλ From<i8> for i16
μ λν ꡬνμ΄ μλ€. μ΄λ i8
νμ
μ κ°μ§ λ³μ x
λ₯Ό i16::from(x)
λ₯Ό νΈμΆν¨μΌλ‘μ λ³μ x
λ₯Ό i16
μΌλ‘ λ³νν μ μμμ μλ―Ένλ€. μλλ©΄, κ°λ¨νκ² x.into()
λ₯Ό μ¬μ©ν μ μλ€. μλνλ©΄ From<i8> for i16
ꡬνμ΄ μλμ μΌλ‘ Into<i16> for i8
ꡬνμ λ§λ€κΈ° λλ¬Έμ΄λ€.
μ΄μ μμ μ½λλ₯Ό μ λλ‘ λμνκ² λ§λ€μ΄λ³΄μ.
fn multiply(x: i16, y: i16) -> i16 {
x * y
}
fn main() {
let x: i8 = 15;
let y: i16 = 1000;
println!("{x} * {y} = {}", multiply(x.into(), y));
}
λ§μ½ λ³νμ μνλ νμ
μ΄ λ³νμ΄ μ§μλλμ§ νμΈνλ €λ©΄, νμ€ λΌμ΄λΈλ¬λ¦¬ λ¬Έμμμ From<T>
κ° κ΅¬νλμ΄ μλμ§λ₯Ό νμΈνλ©΄ λλ€.
μ°λ¦¬λ λ°°μ΄μ΄ λ€μκ³Ό κ°μ΄ μ μΈλλ€λκ²μ λ°°μ λ€.
let array = [10, 20, 30];
μ°λ¦¬λ μμ κ°μ λ°°μ΄μ {:?}
λλ²κ·Έ ννμ μ΄μ©νμ¬ μΆλ ₯ν μ μλ€.
fn main() {
let array = [10, 20, 30];
println!("array: {array:?}"); // array: [10, 20, 30]
}
Rustλ μ°λ¦¬κ° for
ν€μλλ₯Ό μ΄μ©ν΄ λ°°μ΄μ΄λ λ²μμ κ°μ κ²λ€μ μνν μ μκ² ν΄μ€λ€.
fn main() {
let array = [10, 20, 30];
print!("Iterating over array:");
for n in array {
print!(" {n}");
}
println!();
print!("Iterating over range:");
for i in 0..3 {
print!(" {}", array[i]);
}
println!();
}
κ·Έλ λ€λ©΄ λ°°μ΄μ μμκ² μΆλ ₯νλ ν¨μ pretty_print
λ₯Ό λ§λ€κ³ μ΄λ₯Ό μ΄μ©ν΄μ matrixλ₯Ό transposeνλ ν¨μλ₯Ό μμ±ν΄λ³΄μ! (rowμμ columnμΌλ‘)
fn transpose(matrix: [[i32; 3]; 3]) -> [[i32; 3]; 3] {
let mut new_matrix: [[i32;3];3] = [[0;3];3];
for i in 0..3 {
for x in 0..3 {
new_matrix[i][x] = matrix[x][i];
}
}
return new_matrix;
}
fn pretty_print(matrix: &[[i32; 3]; 3]) {
for i in 0..3 {
println!("{:?}", matrix[i]);
}
}
fn main() {
let matrix = [
[101, 102, 103], // <-- the comment makes rustfmt add a newline
[201, 202, 203],
[301, 302, 303],
];
println!("matrix:");
pretty_print(&matrix);
let transposed = transpose(matrix);
println!("transposed:");
pretty_print(&transposed);
}
Rustλ Type Safetyλ₯Ό μ μ νμ΄νμ ν΅ν΄ μ 곡νλ€. λ³μλ κΈ°λ³Έμ μΌλ‘ λΆλ³μΌλ‘ μ μΈλλ€.
fn main() {
let x: i32 = 10;
println!("x: {x}");
// x = 20; (error)
// println!("x: {x}");
}
λ¬μ€νΈλ λ³μμ νμ μ μΆλ‘ νλ€.
fn takes_u32(x: u32) {
println!("u32: {x}");
}
fn takes_i8(y: i8) {
println!("i8: {y}");
}
fn main() {
let x = 10;
let y = 20;
takes_u32(x);
takes_i8(y);
// takes_u32(y);
}
λ¬μ€νΈ μ»΄νμΌλ¬κ° λ³μμ νμ μ μΆλ‘ νλ λ²
μλ μ½λλ_
λ₯Ό placeholderλ‘ μ¬μ©νμ¬ ν¬ν¨λ νμ μ λͺ μμ μΌλ‘ μ§μ νλ μ½λ μμ΄ νΉμ μΌλ° 컨ν μ΄λμ 볡μ¬νλλ‘ μ»΄νμΌλ¬μκ² μ§μνλ€.fn main() { let mut v = Vec::new(); v.push((10, false)); v.push((20, true)); println!("v: {v:?}"); let vv = v.iter().collect::<std::collections::HashSet<_>>(); println!("vv: {vv:?}"); }
collect
λHashSet
μ΄ κ΅¬ννλFromIterator
μ μμ‘΄νλ€.
μ μ μνλ μ μ λ° μμ λ³μλ€μ μν΄ κ΄λ¦¬λλ€.
const
ν€μλλ₯Ό ν΅ν΄ μ»΄νμΌ νμ μμλ₯Ό μ μΈν μ μλ€.
const DIGEST_SIZE: usize = 3;
const ZERO: Option<u8> = Some(42);
fn compute_digest(text: &str) -> [u8; DIGEST_SIZE] {
let mut digest = [ZERO.unwrap_or(0); DIGEST_SIZE];
for (idx, &b) in text.as_bytes().iter().enumerate() {
digest[idx % DIGEST_SIZE] = digest[idx % DIGEST_SIZE].wrapping_add(b);
}
digest
}
fn main() {
let digest = compute_digest("Hello");
println!("Digest: {digest:?}");
}
Rust RFC Bookμ λ°λ₯΄λ©΄ μ΄λ€μ μ¬μ©μ μΈλΌμΈλλ€.
static
ν€μλλ₯Ό ν΅ν΄ μ μ λ³μλ₯Ό μ μΈν μ μλ€.
static BANNER: &str = "Welcome to RustOS 3.14";
fn main() {
println!("{BANNER}");
}
Rust RFC Bookμ λ
ΈνΈμ λ°λ₯΄λ©΄, μ΄λ€μ μ¬μ©μ μΈλΌμΈ λμ§ μκ³ μ€μ μ°κ²°λ λ©λͺ¨λ¦¬ μμΉλ₯Ό κ°μ§λ€. μ΄λ μμ νμ§ μμ μλ² λλ μ½λμ μ μ©νλ©° static
ν μλͺ
μ΄ μλ€.
const
λ μλ―Έλ‘ μ μΌλ‘ C++μconstexpr
μ λΉμ·νλ€.- λ°λ©΄μ
static
μ C++μconst
λ κ°λ³ μ μ λ³μλ€κ³Ό λ λΉμ·νλ€.- λ°νμ νκ° μμκ° νμν κ²½μ°κ° ννμ§λ μμ§λ§ μ μ μ μ¬μ©νλ κ²λ³΄λ€ μ μ©νκ³ μμ νλ€.
λ°κΉ₯ μ€μ½νμ μλ λ³μκ° κ°μ μ€μ½νμ μλ λ³μλ₯Ό μλμ ν μ μλ€.
fn main() {
let a = 10;
println!("before: {a}");
{
let a = "hello";
println!("inner scope: {a}");
let a = true;
println!("shadowed in inner scope: {a}");
}
println!("after: {a}");
}
- μλμμ λͺ¨νΈν΄λ³΄μ΄μ§λ§,
.unwrap()
λ€μ κ°μ μ μ§νλλ° νΈλ¦¬νλ€.- λ€μ μ½λλ νμ μ΄ λ³κ²½λμ§ μλ κ²½μ°μλ μ€μ½νμμ λΆλ³ λ³μλ₯Ό μ¨κΈΈ λ μ»΄νμΌλ¬κ° λ¨μν λ©λͺ¨λ¦¬ μμΉλ₯Ό μ¬μ¬μ©ν μ μλ μ΄μ λ₯Ό 보μ¬μ€λ€.
fn main() { let a = 1; let b = &a; let a = a + 1; println!("{a} {b}"); }
μ ν΅μ μΌλ‘, μΈμ΄λ€μ λκ°μ ν° λ²μ£Όλ‘ λλλ€.
Rustλ λ€μκ³Ό κ°μ μλ‘μ΄ μ‘°ν©μ μ 곡νλ€.
μ¬λ°λ₯Έ λ©λͺ¨λ¦¬ κ΄λ¦¬μ μ»΄νμΌ μκ° μ μ©μ ν΅ν μλ²½ν μ μ΄ λ° μμ μ±
λͺ
μμ μΈ μμ κΆ κ°λ
μ μ¬μ©νμ¬ μ΄λ₯Ό μννλ€.
λ¨Όμ λ©λͺ¨λ¦¬ κ΄λ¦¬κ° μλνλ λ°©μμ λ€μ μ΄ν΄λ³΄μ.
μ€ν: μ§μ λ³μλ₯Ό μν μ°μμ μΈ λ©λͺ¨λ¦¬ μμ
ν: ν¨μ νΈμΆ μΈλΆμ κ° μ μ₯
String
μ μμ±νλ κ²μ κ³ μ λ ν¬κΈ°μ λ°μ΄ν°λ₯Ό stackμ λ£κ³ λ€μ΄λλ―Ήν ν¬κΈ°μ λ°μ΄ν°λ₯Ό heapμ λ£λλ€.
fn main() {
let s1 = String::from("Hello");
}
Stack Heap
.- - - - - - - - - - - - - -. .- - - - - - - - - - - - - - - -.
: : : :
: s1 : : :
: +-----------+-------+ : : +----+----+----+----+----+ :
: | ptr | o---+---+-----+-->| H | e | l | l | o | :
: | len | 5 | : : +----+----+----+----+----+ :
: | capacity | 5 | : : :
: +-----------+-------+ : : :
: : `- - - - - - - - - - - - - - - -'
`- - - - - - - - - - - - - -'
String
μVec
μ μν΄μ μ§μλλ―λ‘, μ©λκ³Ό κΈΈμ΄κ° μμΌλ©° νμ μ¬ν λΉμ ν΅ν΄ λ³κ²½ κ°λ₯ν κ²½μ° μ»€μ§ μ μλ€.
Heap λ©λͺ¨λ¦¬λ₯Ό μ§μ ν λΉ λ° ν λΉ ν΄μ ν μ μλ€.
μ£Όμν΄μ μννμ§ μμΌλ©΄ μΆ©λ, λ²κ·Έ, 보μ μ·¨μ½μ± λ° λ©λͺ¨λ¦¬ λμκ° λ°μν μ μλ€.
malloc
μΌλ‘ ν λΉν λͺ¨λ ν¬μΈν°λ₯Ό free
ν΄μ€μΌ νλ€.
void foo(size_t n) {
int* int_array = (int*)malloc(n * sizeof(int));
//
// ... lots of code
//
free(int_array);
}
ν¨μκ° malloc
κ³Ό free
μ¬μ΄μ μΌμ° λ°νλ κ²½μ°, ν¬μΈν°κ° μ μ€λλ©°, λ©λͺ¨λ¦¬λ₯Ό ν΄μ ν μ μκΈ° λλ¬Έμ λ©λͺ¨λ¦¬ λμκ° λ°μλλ€.
λͺ¨λ λ³μ λ°μΈλ©μλ μ ν¨ν λ²μκ° μμΌλ©° ν΄λΉ λ²μ λ°μμ λ³μλ₯Ό μ¬μ©νλ©΄ μ€λ₯κ° λλ€.
struct Point(i32, i32);
fn main() {
{
let p = Point(3, 4);
println!("x: {}", p.0);
}
println!("y: {}", p.1);
}
Rustμμλ λ³μκ° κ°μ μμ νλ€κ³ λ§νλ€. λͺ¨λ Rust κ°μλ νμ μ νν νλμ μμ μκ° μλ€.
μ€μ½νκ° λλλ©΄ λ³μλ μμ λκ³ λ°μ΄ν°λ ν΄μ λλ€. μ¬κΈ°μ μλ©Έμ(destructor)λ₯Ό μ€ννμ¬ λ¦¬μμ€λ₯Ό ν보ν μ μλ€.
ν λΉμ λ³μκ°μ μμ κΆ μ΄μ μ λ§νλ€.
fn main() {
let s1: String = String::from("Hello!");
let s2: String = s1;
println!("s2: {s2}");
// println!("s1: {s1}");
}
s1
λ³μμμ s2
λ³μλ‘μ ν λΉμ μμ κΆμ μ΄μ μλ€.s1
μ΄ μ€μ½ν λ°μΌλ‘ λκ°λ, μ무κ²λ μΌμ΄λμ§ μλλ€. (μ무κ²λ μμ νκ³ μμ§ μμ)s2
κ° μ€μ½ν λ°μΌλ‘ λκ°λ, λ¬Έμμ΄ λ°μ΄ν°λ ν΄μ λλ€.ν¨μμ κ°μ μ λ¬ν λ, κ·Έ κ°μ ν¨μμ 맀κ°λ³μμ ν λΉλλ€. μ΄κ²μ μμ κΆμ μ΄μ νλ€.
무μΈκ°λ₯Ό 볡μ¬νκ³ μΆμλ, Clone
traitλ₯Ό μ΄μ©νλ©΄ λλ€.
#[derive(Default)]
struct Backends {
hostnames: Vec<String>,
weights: Vec<f64>,
}
impl Backends {
fn set_hostnames(&mut self, hostnames: &Vec<String>) {
self.hostnames = hostnames.clone();
self.weights = hostnames.iter().map(|_| 1.0).collect();
}
}
λ³μ ν λΉμ μμ κΆ μ΄μ μ΄ κΈ°λ³Έμ΄μ§λ§, λͺλͺ νμ λ€μ κΈ°λ³Έμ μΌλ‘ 볡μ λλ€.
fn main() {
let x = 42;
let y = x;
println!("x: {x}"); // would not be accessible if not Copy
println!("y: {y}");
}
μ΄λ¬ν νμ
λ€μ Copy
traitμ ꡬννλ€.
#[derive(Copy, Clone, Debug)]
struct Point(i32, i32);
fn main() {
let p1 = Point(3, 4);
let p2 = p1;
println!("p1: {p1:?}");
println!("p2: {p2:?}");
}
p1
κ³Ό p2
λͺ¨λ μμ μ λ°μ΄ν°λ₯Ό μμ νκ³ μλ€.p1.clone()
μ ν΅ν΄ λͺ
μμ μΌλ‘ λ°μ΄ν°λ₯Ό 볡μ ν μ μλ€.Drop
traitλ₯Ό ꡬννλ κ°λ€μ μ€μ½ν λ°μΌλ‘ λκ°μ λ μ€νν μ½λλ₯Ό μ ν μ μλ€.
struct Droppable {
name: &'static str,
}
impl Drop for Droppable {
fn drop(&mut self) {
println!("Dropping {}", self.name);
}
}
fn main() {
let a = Droppable { name: "a" };
{
let b = Droppable { name: "b" };
{
let c = Droppable { name: "c" };
let d = Droppable { name: "d" };
println!("Exiting block B");
}
println!("Exiting block A");
}
drop(a);
println!("Exiting main");
}
Box<T>
Box
λ νμ λ°μ΄ν°μ λν μμ ν¬μΈν°μ΄λ€.
fn main() {
let five = Box::new(5);
println!("five: {}", *five);
}
Box<T>
λ Deref<Target = T>
λ₯Ό ꡬννλ€. μ΄λ μ¦ Box<T>
μμ T
μ λ©μλλ₯Ό μ§μ νΈμΆν μ μλ€λ λ»μ΄λ€.
μ¬κ· μ ν, νΉμ λμ ν¬κΈ°μ λ©μ΄ν° μ νμ Box
λ₯Ό μ¬μ©ν΄μΌνλ€.
#[derive(Debug)]
enum List<T> {
/// A non-empty list: first element and the rest of the list.
Element(T, Box<List<T>>),
/// An empty list.
Nil,
}
fn main() {
let list: List<i32> =
List::Element(1, Box::new(List::Element(2, Box::new(List::Nil))));
println!("{list:?}");
}
Rc
λ μ°Έμ‘° κ³μ°λ 곡μ ν¬μΈν°μ΄λ€.
μ¬λ¬ μμΉμμ λμΌν λ°μ΄ν°λ₯Ό μ°Έμ‘°ν΄μΌ ν λ μ΄ λ°©λ²μ μ¬μ©νλ©΄ λλ€.
use std::rc::Rc;
fn main() {
let a = Rc::new(10);
let b = Rc::clone(&a);
println!("a: {a}");
println!("b: {b}");
}
Arc
μ Mutex
λ₯Ό 보면 λλ€.Weak
ν¬μΈν°λ‘ λ€μ΄κ·Έλ μ΄λνμ¬ μμ λλ μ£ΌκΈ°λ₯Ό λ§λ€ μ μλ€.Trait ojectsλ μλ₯Ό λ€μ΄ 컬λ μ μμ λ€μν μ νμ κ°μ νμ©νλ€.
struct Dog {
name: String,
age: i8,
}
struct Cat {
lives: i8,
}
trait Pet {
fn talk(&self) -> String;
}
impl Pet for Dog {
fn talk(&self) -> String {
format!("Woof, my name is {}!", self.name)
}
}
impl Pet for Cat {
fn talk(&self) -> String {
String::from("Miau!")
}
}
fn main() {
let pets: Vec<Box<dyn Pet>> = vec![
Box::new(Cat { lives: 9 }),
Box::new(Dog { name: String::from("Fido"), age: 5 }),
];
for pet in pets {
println!("Hello, who are you? {}", pet.talk());
}
}
Google, Comprehensive Rust: https://google.github.io/comprehensive-rust/