Rust의 긴 긴 형식 이름

머리



이 기사의 목적은 매우 긴 이름의 유형을 생성하고 컴파일러에서 재생할 수있는 유형 추론과 경계 경계의 고마움을 이해하는 것입니다.
기념해야 할 첫 게시물.

소개



Rust나 C++는, 형명이 길어지기 쉬운 성질을 가지고 있습니다.
C++에서 STL을 구사해 코드를 쓰고 있을 때는, 형명의 길이(와 <<<>>가 많음)가 싫어져 버린 적도 있습니다.
Rust에서는 형추론(및 그것을 돕는 트레이트 경계) 덕분에 긴 형명을 볼 기회는 적다고 생각합니다. 그러나, 형명은 수면하에 존재하고 있어,현재화하면 아래와 같은 참극을 일으킵니다.

※impl Trait가 도입되어 상기의 문제는 해결되었지만, std::any::Any를 사용하려면 아직 진정한 이름이 필요할 것.

주제



본제의 코드는 이쪽. get_longname은 Vec과 슬라이스를 받고 반복자를 반환하는 함수입니다. 그렇게 부자연스럽지 않다고 생각합니다만…
fn get_longname(input :Vec<isize>, n :&[usize])->impl Iterator<Item=isize>{
    let a = input.into_iter();
    let mut n = n.into_iter();

    let a = match n.next() {
        Some(&x) => Enum::A(a.take(x)),
              _  => Enum::B(a),
    };
    let a = match n.next() {
        Some(&x) => Enum::A(a.take(x)),
              _  => Enum::B(a),
    };
    let a = match n.next() {
        Some(&x) => Enum::A(a.take(x)),
              _  => Enum::B(a),
    };
    let a = match n.next() {
        Some(&x) => Enum::A(a.take(x)),
              _  => Enum::B(a),
    };
    a

}

반환값의 정확한 형명은 이쪽
Enum>, std::vec::IntoIter>>, Enum>, std::vec::IntoIter>>> , Enum>, std::vec::IntoIter>>, Enum>, std::vec::IntoIter>>>>, Enum>, std::vec::IntoIter>>, Enum>, std::vec::IntoIter>>>, Enum>, std::vec::IntoIter>>, Enum>, std::vec::IntoIter>>>>
여기까지 길어진다고 상상할 수 있었습니까?
게다가 let a = match…에서…};까지의 4행을 추가할 때마다 형명의 길이는 지수 함수적으로 늘어납니다. 어떤 길이의 형명도 간단하게 준비할 수 있네요.
Rust에서는 이렇게 형식 이름이 매우 길어질 수 있습니다. 때로는 다루는 유형의 진정한 이름을 살펴 보는 것도 좋습니다. 변수 뒤에 :u8이라고 쓰면 확인할 수 있습니다 (impl Trait 이외).

※Enum의 정의는 여기 링크 의 코드를 사용했습니다.
enum Enum<A, B> {
    A(A),
    B(B),
}

impl<A, B> Iterator for Enum<A, B>
where
    A: Iterator,
    B: Iterator<Item = A::Item>,
{
    type Item = A::Item;
    fn next(&mut self) -> Option<Self::Item> {
        match self {
            Enum::A(x) => x.next(),
            Enum::B(x) => x.next(),
        }
    }
    fn size_hint(&self) -> (usize, Option<usize>) {
        match self {
            Enum::A(x) => x.size_hint(),
            Enum::B(x) => x.size_hint(),
        }
    }
}

요약


  • Rust의 형명은 길다.
  • 하지만 평소에는 의식하지 않아.
  • 가끔 확인하자.



  • match를 포함한 문장을 6개로 늘린 경우

    좋은 웹페이지 즐겨찾기