열거형은 메서드도 추가된다.
메서드는 데이터와 관련 코드를 캡슐화하여 객체 지향적인 방식으로 표현된다.
메서드의 첫 번째 매개변수는 항상 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"
명시적 match 표현식보다는 Option과 Result의 변환을 선호해야 합니다.
Option과 Result의 변환에 익숙해지고, Option보다는 Result를 선호하세요. 변환이 참조와 관련될 때는 필요에 따라 .as_ref()를 사용하세요.
Option과 Result에 대한 명시적인 match 연산 대신 이러한 변환을 사용하는 것이 좋습니다.
특히, 결과 타입을 ? 연산자가 적용될 수 있는 형태로 변환하는 데 이러한 변환을 사용하세요.