동일한 유형의 벡터를 압축하면 맵 폐쇄 내에서 다른 유형이 발생합니다.

Aug 16 2020

배경

열거 형 변형 유형이 주어지면 (복사 불가능) :

enum AstNode {
  Op(Func, Box<AstNode>, Box<AstNode>),
  Val(f64),
  // others...
}

이러한 두 벡터에 대해 작업을 실행하려고합니다.

fn apply_func_iterative(func: Func, lhs: Vec<AstNode>, rhs: Vec<AstNode>) -> Vec<AstNode> {
    lhs.iter().zip(rhs).map(|(&l,r)| apply_func(func,l,r)).collect()  // l and r are declared differently!
}

fn apply_func(func: Func, lhs: AstNode, rhs: AstNode) -> AstNode {
    // magic happens here!
}

클로저 내에서 lhs요소는 유형을 가정 l: &AstNode하는 반면 압축 rhs요소는 유형을 취합니다 l: AstNode. (클로저 튜플의 다른 선언에 유의하십시오).

질문

왜 그렇습니까?

참조 대신 값으로 벡터의 요소를 반복하는 방법이 있습니까? 이는 압축 된 요소의 관찰 된 동작에서 가능해 보입니다.

(이 예에서는이 차이로 인해 구문 선언이 약간 이상하지만 실제로는 참조 변수를 함수에 전달할 때 차용 검사기를 사용했습니다.)

면책 조항 : 저는 Rust를 처음 접했습니다.

답변

6 kmdreko Aug 16 2020 at 04:55

이 Iterator::zip메서드는 특별한 작업을 수행하지 않고 단순히 두 반복자를 결합하는 것입니다. 당신이 찾고 있습니다 lhs.iter()수익률 Iterator<&AstNode>동안 rhs결정타 Iterator<AstNode>( &비 대 &)를.

참조 대신 값으로 벡터의 요소를 반복하는 방법이 있습니까? 이는 압축 된 요소의 관찰 된 동작에서 가능해 보입니다.

예,이 동작을 제어하는 ​​방법이 있습니다. 핵심은 zip()의 주장 rhsIntoIterator특성을 구현해야 한다는 점을 알아 차리는 것입니다 . 내부적으로 zip()rhs.into_iter()이터레이터를 가져 오기 위해 호출 합니다. 기존의 동작은 소스 .iter()만 빌려서 해당 값에 대한 참조 만 제공 할 수 있다는 것입니다. 동안 소비하는 또는 "소유권한다" 원본을 소유 값을 얻을 수 있습니다..into_iter()

이들을 결합하면 lhs.into_iter().zip(rhs)값에 대한 반복자를 가져 (AstNode, AstNode)오거나 lhs.iter().zip(rhs.iter())참조에 대한 반복기를 가져 오는 데 사용할 수 (&AstNode, &AstNode)있습니다.