메서드 체이닝
Coddy Rust 여정의 Object Oriented Programming 섹션에 포함된 레슨 — 61개 중 6번째.
지금까지 우리의 가변 메서드들은 구조체를 수정하고 아무것도 반환하지 않았습니다. 하지만 동일한 인스턴스에 대해 여러 메서드를 연속해서 호출하고 싶다면 어떨까요? self에 대한 참조를 반환함으로써, 여러 메서드 호출이 하나의 표현식으로 이어지는 패턴인 메서드 체이닝(method chaining)을 가능하게 할 수 있습니다.
핵심은 &mut self 메서드가 &mut Self를 반환하도록 하는 것입니다:
struct Config {
debug: bool,
timeout: u32,
}
impl Config {
fn new() -> Config {
Config { debug: false, timeout: 30 }
}
fn set_debug(&mut self, value: bool) -> &mut Self {
self.debug = value;
self
}
fn set_timeout(&mut self, seconds: u32) -> &mut Self {
self.timeout = seconds;
self
}
}
각 메서드는 구조체를 수정한 다음, 동일한 인스턴스에 대한 가변 참조인 self를 반환합니다. 이를 통해 다음 메서드 호출이 즉시 작업을 이어갈 수 있습니다:
fn main() {
let mut config = Config::new();
config.set_debug(true).set_timeout(60);
println!("Debug: {}, Timeout: {}", config.debug, config.timeout);
// 출력: Debug: true, Timeout: 60
}
세 개의 별도 문장을 작성하는 대신, 모든 것을 하나의 유연한 라인으로 구성합니다. 이 "빌더 스타일(builder-style)" 패턴은 많은 선택적 설정이 있는 객체를 설정할 때 특히 유용하며, 코드를 더 간결하고 읽기 쉽게 만들어 줍니다.
챌린지
쉬움세 개의 필드 bold (bool), italic (bool), size (u32)를 가진 TextStyle 구조체를 생성하세요.
TextStyle에 대해 다음을 포함하는 구현 블록을 추가하세요:
new—bold는false,italic은false,size는12로 설정된TextStyle을 반환하는 연관 함수set_bold—&mut self와bool값을 매개변수로 받아 bold 필드를 설정하고, 메서드 체이닝을 위해&mut Self를 반환set_italic—&mut self와bool값을 매개변수로 받아 italic 필드를 설정하고, 메서드 체이닝을 위해&mut Self를 반환set_size—&mut self와u32값을 매개변수로 받아 size 필드를 설정하고, 메서드 체이닝을 위해&mut Self를 반환
세 개의 입력을 받게 됩니다:
- 첫 번째 줄: bold 설정 (
true또는false) - 두 번째 줄: italic 설정 (
true또는false) - 세 번째 줄: 폰트 크기 (u32)
new를 사용하여 가변(mutable) TextStyle을 생성한 다음, 메서드 체이닝을 사용하여 단일 표현식으로 세 가지 설정을 모두 적용하세요. 최종 상태를 아래에 표시된 형식으로 출력하세요.
예상 출력 형식:
Bold: {bold}, Italic: {italic}, Size: {size}치트 시트
&mut self를 받는 메서드는 메서드 체이닝(method chaining)을 가능하게 하기 위해 &mut Self를 반환할 수 있습니다:
impl Config {
fn set_debug(&mut self, value: bool) -> &mut Self {
self.debug = value;
self
}
fn set_timeout(&mut self, seconds: u32) -> &mut Self {
self.timeout = seconds;
self
}
}
이를 통해 단일 표현식에서 여러 메서드 호출이 가능해집니다:
let mut config = Config::new();
config.set_debug(true).set_timeout(60);
각 메서드는 구조체를 수정하고 동일한 인스턴스에 대한 가변 참조를 반환하여, 다음 메서드가 즉시 작업을 계속할 수 있도록 합니다.
직접 해보기
use std::io;
// TODO: 여기에 TextStyle 구조체를 정의하세요
// TODO: TextStyle에 대한 구현 블록을 다음 항목과 함께 추가하세요:
// - new() 연관 함수
// - set_bold() 메서드
// - set_italic() 메서드
// - set_size() 메서드
fn main() {
let mut input = String::new();
// 굵게(bold) 설정 읽기
io::stdin().read_line(&mut input).expect("Failed to read line");
let bold: bool = input.trim().parse().expect("Invalid bool");
input.clear();
// 기울임꼴(italic) 설정 읽기
io::stdin().read_line(&mut input).expect("Failed to read line");
let italic: bool = input.trim().parse().expect("Invalid bool");
input.clear();
// 크기(size) 설정 읽기
io::stdin().read_line(&mut input).expect("Failed to read line");
let size: u32 = input.trim().parse().expect("Invalid u32");
// TODO: new()를 사용하여 가변 TextStyle을 생성한 다음, 메서드 체이닝을 사용하여
// 단일 표현식으로 세 가지 설정을 모두 적용하세요
// TODO: 결과를 다음 형식으로 출력하세요: Bold: {bold}, Italic: {italic}, Size: {size}
}이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.