[%]
슬슬 for 문을 줄여가는중이다
익명(112.216)
2020-02-19 17:25
추천 0
fn
split_for( v
:Vec
<u8
> ) -> Vec
<Vec
<u8
>> {
let mut rt
:Vec
<Vec
<u8
>> = vec
![];
let mut tmp
:Vec
<u8
> = vec
![];
for i in v
{
if i
== 0 {
rt
.push( tmp
);
tmp
= vec
![];
} else {
tmp
.push( i
);
}
}
if tmp
.len() != 0 {
rt
.push( tmp
);
}
rt
}
fn
split_pat( v
:Vec
<u8
> ) -> Vec
<Vec
<u8
>> {
let b
= v
.split( |s
| *s
== 0 );
b
.into_iter().map( |s
| s
.into_iter().map( |v
| (*v
).clone() ).collect() ).collect()
}
fn
main() {
let a
:Vec
<u8
> = vec
![1,1, 0 ,2,2, 0 ,3,3];
println
!("{:?}", split_for( a
.clone() ) );
println
!("{:?}", split_pat( a
.clone() ) );
}
Compiling playground v0.0.1 (/playground)
Finished dev [unoptimized + debuginfo] target(s) in 0.61s
Running `target/debug/playground`
[[1, 1], [2, 2], [3, 3]]
[[1, 1], [2, 2], [3, 3]]
for 만 존나게 쓰다가 이제 pattern 에 익숙해지니까 좋긴한데
문제는 다른 팀원들이 못알아먹겠다고 걍 for 문 쓰자고 함;
>> clippy 로 줄여봄
fn
split_for( v
:Vec
<u8
> ) -> Vec
<Vec
<u8
>> {
let mut rt
:Vec
<Vec
<u8
>> = vec
![];
let mut tmp
:Vec
<u8
> = vec
![];
for i in v
{
if i
== 0 {
rt
.push( tmp
);
tmp
= vec
![];
} else {
tmp
.push( i
);
}
}
if !tmp
.is_empty() {
rt
.push( tmp
);
}
rt
}
fn
split_pat( v
:Vec
<u8
> ) -> Vec
<Vec
<u8
>> {
v
.split( |s
| *s
== 0 )
.map( |s
| s
.iter().copied().collect() ).collect()
}
fn
main() {
let a
:Vec
<u8
> = vec
![1,1, 0 ,2,2, 0 ,3,3];
println
!("{:?}", split_for( a
.clone() ) );
println
!("{:?}", split_pat( a
.clone() ) );
}
https://nanikit.github.io/dc-highlighter/
https://carbon.now.sh/
ㅇㅋ
일단 cargo clippy 돌려보셈 아마 여러가지로 경고가 뜰거같음
내 생각엔 split_pat 함수 코드양 반은 줄일수 있을거같음
fold 로 돌릴까 생각해봤지만 어차피 collect 는 두번 호출해야될거 같음
collect랑 split말고 나머지 함수들 거의 boilerplate임
fold는 안쓰는게 맞고 ㅇㅇ
일단 clippy 돌려보십셔
러스트를 같이 쓰는 팀원이 있다니 럭키하시군요
패턴 익숙해좋으니 너무 좋다 성능도 release 에선 차이가 없고
저건 패턴이 아니라 반복자 ㅇㅇ
두번째 버전 편-안하네 이제 map(Vec::from)으로 ㄱㄱ
v.split(|s| *s == 0).map(Vec::from).collect() ㅇㅇ
이건 필수는 아닌데 인자를 &[u8]로 고치는것도 고려해보셈
저 코드 자체를 쓸건 아니고 어차피 기본 알고리즘만 playground 에서 시험해본거였음
ㅇㅋㅇㅋ