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개로 늘린 경우
Reference
이 문제에 관하여(Rust의 긴 긴 형식 이름), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/mp2147483647/items/4cc56b0cc80369828a88
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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개로 늘린 경우
Reference
이 문제에 관하여(Rust의 긴 긴 형식 이름), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/mp2147483647/items/4cc56b0cc80369828a88
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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
}
여기까지 길어진다고 상상할 수 있었습니까?
게다가 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(),
}
}
}
요약
덤
match를 포함한 문장을 6개로 늘린 경우
Reference
이 문제에 관하여(Rust의 긴 긴 형식 이름), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/mp2147483647/items/4cc56b0cc80369828a88텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)