티스토리 뷰
오늘의 rust exercism - std::iter::Zip 이랑 std::iter::Empty 를 합칠 수 없나?
Ch. 2020. 6. 24. 23:46배열의 크기가 2 이상일때만 배열을 어떻게 zip으로 만지작한 뒤에 나중에도 계속 컬렉션 취급을 하고싶었음.
근데 그 이외의 경우엔 empty() 취급해야 하잖아요? 그냥은 될 리가 없지
처음에 짠 코드가 컴파일이 안 되니까 어떻게 해결해보겠다고 (성능?은 살짝 아쉽지만) 타입 어노테이션을 추가해본건데...
될 리가 없지. 이게 함수였고 반환받은 게 borrow였으면 말이 됐을지도 모름.
물론 정적으로 컴파일하는 언어인 만큼 아무리 lazy 라도 Zip 이랑 Empty 는 타입이 다르고, 하나로 퉁쳐서 쓸 수 없음
dyn Iterator 로 trait object 취급하는 건 말이 안 되는 짓이었는데, 이유는 이게 레퍼런스가 아니기 때문. 그렇다고 둘 다 &mut 을 추가하면
stackoverflow.com/a/29760740/4394750
☆ 축 드랍 ☆
지역변수 zipped 님께서 퇴장하셨습니다.
결국 나는 collect() 하고 Option 으로 감싸는 방식으로 해결했는데, 찾아보니 Option 도 IntoIterator trait을 구현하기 때문에 가능한 짓.
stackoverflow.com/questions/40907897/iterator-on-optionvec
근데 말이죠
exercism.io/tracks/rust/exercises/proverb/solutions/c2e813a224414b7894efbf82f4bc03ec
풀이 제출하고 나서 다른 사람 풀이를 봤는데,
아예 이럴 필요가 없이 skip(1) take(1) 같은 거 쓰면 알아서 Option 이라 이런 뻘짓을 할 필요가 없었던 겁니다.
pub fn build_proverb(list: &[&str]) -> String {
list.iter()
.zip(list.iter().skip(1))
.map(|(normal, offset)| format!("For want of a {} the {} was lost.", normal, offset))
.chain(
list.iter()
.take(1)
.map(|v| format!("And all for the want of a {}.", v)),
)
.collect::<Vec<_>>()
.join("\n")
}
exercism.io/tracks/rust/exercises/proverb/solutions/5b7c3a45c2e849418b8f40437ea06440
허허허허허허...
여기서 유의해서 볼 점은 zip에 skip(1) 을 한 걸 넣고 있다는 건데, 이게 제대로 돌아간다는 의미는 zip은 배열 a, b 중 짧은 놈 길이에 맞춰서 조립한다는 뜻. 문서 보면 그렇게 나오겠죠 머 안 읽어봤지만
근데 저 Vec<_> 는 왜 넣은
---
재밌었습니다. 오늘은 꽤나 많은 시간을 소요했네요
- Total
- Today
- Yesterday
- ActivityPub
- K8s
- 토이프로젝트
- upbit
- mvu
- exercism
- c++
- rust-lang
- javascript
- 시스어드민
- ArchLinuxARM
- C++ FAQ
- scss
- 업비트
- pleroma
- Oracle Cloud Infrastructure
- 왜 생각이 안 났지
- 오라클 클라우드
- 쿠버네티스
- C#
- Sass
- kotlin당했다
- OStatus
- gitea
- 오라클 클라우드 인프라
- pdf.js
- vuex
- Godot Engine
- 마스토돈
- 개발기록
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |