2017-10-24 11 views
4

특성을 구현하는 구조체에 대한 일종의 기본 반복기를 구현하려고합니다. DataRow를 호출 내 특성은, 테이블 셀의 행을 나타내며, 다음과 같습니다녹에서 특성을위한 반복자 구현

pub trait DataRow<'a> { 
    // Gets a cell by index 
    fn getCell(&self, i: usize) -> &DataCell<'a>; 

    // Gets the number of cells in the row 
    fn getNumCells(&self) -> usize; 
} 

나는 셀 참조를 행을 반복하고 반환하는 두 가지 방법을 사용한다 제공 할 기본 반복자. 자바에서는 Iterable을 구현하는 추상 클래스 인 DataRow가 필요합니다.

impl<'a, T> IntoIterator for &'a T 
where 
    T: DataRow<'a> 
{ 
    type Item = &'a DataCell<'a>; 
    type IntoIter = DataRowIterator<'a, T>; 
    fn into_iter(self) -> DataRowIterator<'a, T> { 
     return DataRowIterator::new(self); 
    } 
} 

을하지만 사람이 된 DataRow 특성 자신의 구현을 위해 자신의 반복자를 구현할 수 있기 때문에이 작동하지 않습니다 : 녹 나는 IntoIterator 먼저 시도했다. 자아의 크기는 컴파일에 알려져 있지 않기 때문에,

fn iter(&self) -> DataRowIterator<'a, Self> { 
    return DataRowIterator::new(self); 
} 

이, 그러나 중 하나가 작동하지 않습니다

내 두 번째 시도는 반복자를 생성하고 그것을 반환 특성,에 iter 방법을 추가했다 시각. DataRow는 임의의 수의 셀을 포함 할 수 있으므로이를 회피하기 위해 Sized으로 표시 할 수 없습니다. 발생하는 오류에 대한 사항을 포함하여 내 데모 코드는 여기에 있습니다 :

https://play.rust-lang.org/?gist=dc128a133ffb5d7471d47d130520936d&version=stable

어떻게 사람이 사용자 지정 특성에 대한 이러한 "기본 반복자"를 구현하는 것이?

답변

2

특성 개체 참조에 IntoIterator을 구현할 수 있습니다.

impl<'a> IntoIterator for &'a DataRow<'a> { 
    type Item = &'a DataCell<'a>; 
    type IntoIter = DataRowIterator<'a>; 
    fn into_iter(self) -> DataRowIterator<'a> { 
     return DataRowIterator::new(self); 
    } 
} 

DataRowIterator

특성은 오브젝트 레퍼런스 &DataRow 대신 &T의 유지 특성과 DataRow 가능한 방법을 사용하도록 변경한다.

+0

감사합니다. 당신이 신경 쓸 필요가 없다면 빠른 후속 질문 : 코드에서 주석으로 처리 된 루프에서 이제는'ref 셀을 위해 (& row로 & DataRow)'를 써야합니다. 이 모형 주위에 방법이 있을까요? – AlexanderF

+1

"모든 사용자가 DataRow 특성을 자체적으로 구현하기 위해 자체 반복자를 구현할 수있다"고 했으므로 어떤 종류의 캐스트가 필요합니다. 헬퍼 함수'fn def_iter (p : & T) -> & DataRow {p}'를 만들면, 코드는'for_def_iter (& row)'의 셀을위한 것이다. BTW, 당신은'ref'를 필요로하지 않습니다. 셀은 이미 참조입니다. – red75prime

+0

그건 의미가 있습니다. 고맙습니다! – AlexanderF