러스트에서 흔히 쓰는 연산의 시각적 노이즈를 줄이기 위해 한 글자 대문자 함수 C/O/S/I/X를 제공하는 powerletters 크레이트를 소개하고, 예제와 함께 특히 I가 Result 무시를 타입 안전하게 만드는 점을 설명한다.
러스트에는 자잘하지만 흔한 일을 하는 메서드들을 우리가 늘 호출하는데, 시각적 노이즈가 너무 크다. clone이나 to_owned 같은 것들을 떠올려 보자. 기타 등등.
몇 달째 몇 가지 편의 함수를 써서 몇몇 일반적인 러스트 연산을 덜 지저분하게 만들고 있는데, 꽤 마음에 든다 — unwrap을 볼 때마다 내… 파워레터가 있었다면! 하고 생각한다.
하하.
크레이트 문서에 설명된 것처럼 아주 단순하다. 파워레터는 한 글자짜리 대문자 함수/메서드다:
C - CloneO - ToOwnedS - ToStringI - Result 무시X - Result와 Option에서 expect실전 예:
use powerletters::*;
// 소유 문자열 생성
let bagostuff = vec![S("a"), S("b"), S("c")];
// 벡터 복제
let newbag = bagostuff.C();
// Some임을 아는 Option 언랩
let maybe_bag = Some(newbag);
let stuff = maybe_bag.X();
꽤 자명한 것들이다. 유일하게 덜 분명한 파워레터는 I다. 이는 어떤 트레이트나 메서드에도 해당하지 않는다. 대신 let _ = some_result 패턴을 타입 안전하게 만든다. 그리고 문법적으로 어색한 느낌도 덜하다.
예를 보자:
let _ = do_something_important();
여기서 실제로 무슨 일이 일어나는 걸까? 아마 Result를 무시하고 있을 것이다. do_something_important의 반환 타입은 무엇일까? 상관없다. 어차피 무시하고 있으니까.
do_something_important를 다음과 같이 바꾼다면
fn do_something_important() -> Result<(), Box<dyn Error>>
이렇게:
async fn do_something_important() -> Result<(), Box<dyn Error>>
이제 우리는 future를 조용히 떨어뜨리고 있고, 그게 의도된 것처럼 보인다. 실제로 내가 겪어 봤다!
이렇게 하면 어떨까:
do_something_important().I();
아무튼 파워레터가 실제로 쓰이는 모습을 감상해 보자:
let mut parents: Vec<_> = path.ancestors().skip(1).map(|path| {
if path == Path::new("") {
let parent_path = pathgen.from_path(path).X();
let parent_label = S("<root>");
(parent_path, parent_label)
} else {
let parent_path = pathgen.from_path(path).X();
let parent_label = path.iter().last().X().to_string_lossy().S();
(parent_path, parent_label)
}
}).collect();