rust trading project : iter zip

wangki·2025년 4월 1일

trading-algorithm

목록 보기
3/9

개요

트레이딩 프로젝트를 꾸준히 개발을 하고 있다.
개발을 하며 여러 데이터를 다루는데 특히 Vec<T>을 다루는 일이 많았다. 유용한 방법을 간단히 작성할 예정이다.

내용

1. zip

Vec 컨테이너가 서로 다른 타입을 가진다고 한다면 어떻게 두개 이상의 컨테이너를 동시에 처리할 수 있을까 고민하였다. 예시를 보겠다.

	let prize_list: Vec<String> = vec![
        "노트북".to_string(), 
        "아이패드".to_string(), 
        "애플워치".to_string()
    ];

    let winner_list: Vec<Test> = vec![
        Test { name: "홍길동".to_string(), age: 29},
        Test { name: "핑구".to_string(), age: 23},
        Test { name: "루피".to_string(), age: 43},
    ];

prize_list는 상품을 순서대로 담았다.
winner_list는 승자를 순서대로 담았다.

만약에 인덱스에 따라 컨테이너의 요소가 매칭된다고 해보자. for문을 통해서 인덱스에 접근할 수 있다.

    for idx in 0..prize_list.len() {
        let winner_info = &winner_list[idx];
        let prize = &prize_list[idx];
        println!("{}님은 상품 {}을 받으셨습니다! 축하드립니다~", winner_info.name, prize);
    }


위와 같이 출력되는 걸 확인할 수 있다. 그러나 만약에 두 벡터의 길이가 다르다면 index out of bounds에러가 발생한다.

물론 단순하고 정확히 길이를 알 수 있는 경우에는 위와 같이 할 수 있다.

iterator의 더 많은 메서드를 활용한다면 안전하고 유연하게 처리할 수 있다.

zip을 활용하여 처리해보겠다.

    winner_list.iter().zip(prize_list.iter()).for_each(|(winner, prize)| {
        println!("{}님은 상품 {}을 받으셨습니다! 축하드립니다~", winner.name, prize);
    });

간단하게 처리할 수 있다. 또한 두 벡터의 길이가 다르더라도 작은 것을 기준으로 처리를 하기 때문에 안전하게 처리할 수 있다.

결론

iter를 활용하여 유연하게 처리할 수 있는 것이 정말 편한 것 같다.
트레이딩 프로젝트를 개발하며 klines데이터를 통해 구한 ema와 비교할 때 두 벡터를 한 번에 처리하는 과정에서 zip을 활용하였다.
더 좋은 방법이 있는지 확인해야겠다.

2개의 댓글

comment-user-thumbnail
2025년 4월 1일

오늘은 양이 좀 적네요? 그래도 항상 발전하는 모습 보기 좋아요!

1개의 답글