From and Into

From 과 Into 매우 유용하며 개념만 이해한다면 쉽게 사용할 수 있다.

간단하게 설명하고 예제로 알아보자. 먼저 A 라는 enum 또는 struct 이 존재한다고 하자. A 는 B를 가져와서 A 화 할 수 있다.

마찬가지로 B 도 원하면 A 가 될 수 있다. 말이 이상한데 예제로 살펴보자. 앞에서 종종 나왔지만 String::from 과 같은 trait 를 구현한 것이다.


#[derive(Debug)]
struct Gwano {
    kind: String, 
}


// std::lib 에 구현된 from tait 를 이용하여 gwano Struct 을 구현하였다. 
impl From<String> for Gwano {
    fn from(value : String) -> Self {
        Gwano {
            kind : value,
        }
    }
}


fn main() {
   
   let k = Gwano::from("good".to_string()); 

   println!("{:?}", k);
   

   //into 는 from 을 구현하면 자동으로 구현된다고 생각하자. 
   //주의해야할 점은 into() 함수 사용 시, 타입을 필수로 지정해야 한다. 그래야 컴파일러가 어떤 타입으로 converting 할지 
   //알 수 있다.

   let kk = "veryGood".to_string();
   let answer:Gwano = kk.into();
   
   println!("{:?}", answer);
}

TryFrom and TryInto

from and into 와 비슷한데, 리턴 값이 Err 일 수 있는 상황에서 유용하다. Result<> 타입은 추후에 자세히 다룬다. 이런 것이 있다 정도만 알아두자.


#[derive(Debug)]
struct Gwano {
    kind: String, 
}

// 구현된 tryform trait 을 이용해 gwano 를 impl 한다. 
impl TryFrom<String> for Gwano {
    type Error = ();

    fn try_from(value: String) -> Result<Self, Self::Error> {
        if value == "answer".to_string() {
            let answer = Gwano {
                kind : value ,
            };
            Ok(answer)
        } else { 
           Err(()) 
        }
    }
}


fn main() {
    
    let check = "answer".to_string();
    let n_check = "not".to_string();

    let an1 = Gwano::try_from(check);
    
    println!("{:?}", an1);
    let an2 = Gwano::try_from(n_check);
    println!("{:?}", an2);
}