이펙티브 러스트 2

손호준·2024년 12월 12일
0

Item 2: Use the type system to express common behavior

열거형은 메서드도 추가된다.

메서드는 데이터와 관련 코드를 캡슐화하여 객체 지향적인 방식으로 표현된다.

self와 메서드의 동작

메서드의 첫 번째 매개변수는 항상 self의 변형으로, 이 매개변수가 데이터 구조에 대해 수행할 수 있는 작업을 나타냅니다.

&self: 데이터 구조의 내용을 읽을 수는 있지만 수정할 수는 없습니다.
&mut self: 데이터 구조의 내용을 수정할 수 있습니다.
self: 데이터 구조를 소비(소멸)하며, 이 메서드 이후에는 데이터 구조를 사용할 수 없습니다.

함수 포인터

일반 함수를 함수 인자로 넘길 수 있다. 함수를 다른 함수의 인자로서 사용하게끔 하기 위해서는 함수 포인터를 이용한다. 함수는 (소문자 f를 써서) 타입 fn이 되는데, fn 타입을 함수 포인터라 부른다. (Fn 클로저 트레잇과는 다르다.)

fn add_one(x: i32) -> i32 {
    x + 1
}

fn do_twice(f: fn(i32) -> i32, arg: i32) -> i32 {
    f(arg) + f(arg)
}

fn main() {
    let answer = do_twice(add_one, 5);

    println!("The answer is: {}", answer);
}

단순히 코드 일부에 대한 포인터로, 함수의 시그니처(형태)를 반영하는 타입을 가진다.

fn sum(x: i32, y: i32) -> i32 {
    x + y
}
// Explicit coercion to `fn` type is required...
let op: fn(i32, i32) -> i32 = sum;

// `fn` types implement `Copy`
let op1 = op;
let op2 = op;
// `fn` types implement `Eq`
assert!(op1 == op2);
// `fn` implements `std::fmt::Pointer`, used by the {:p} format specifier.
println!("op = {:p}", op);
// Example output: "op = 0x101e9aeb0"

Item 3: Prefer Option and Result transforms over explicit match expressions

명시적 match 표현식보다는 Option과 Result의 변환을 선호해야 합니다.

Option과 Result의 변환에 익숙해지고, Option보다는 Result를 선호하세요. 변환이 참조와 관련될 때는 필요에 따라 .as_ref()를 사용하세요.
Option과 Result에 대한 명시적인 match 연산 대신 이러한 변환을 사용하는 것이 좋습니다.
특히, 결과 타입을 ? 연산자가 적용될 수 있는 형태로 변환하는 데 이러한 변환을 사용하세요.

profile
Rustacean🦀

0개의 댓글