은이 방법을 결합 평생을 추가 할 수 있습니다. 이렇게하면 유형으로 할 수있는 일이 크게 제한됩니다. 예를 들어 Holder
을 직접 반환 할 수 없습니다. 유형 매개 변수를 사용하는
struct Holder<T> where T: Iterator<int> {
x : T
}
하자의 변화 get_iterator
:
수락 Holder
함으로써 유형 매개 변수를이 문제를 해결할 수
impl<T> Holder<T> where T: Iterator<int>+Copy {
fn get_iterator(&self) -> T {
self.x
}
}
참고 : 나는 추가 여기에 있기 때문에 바인딩 Copy
get_iterator
은 현재 사본을 반환합니다. get_iterator
이 &T
을 반환하게함으로써 경계를 피할 수 있습니다.
new
의 경우 완전히 재 설계해야합니다. 그대로 유지하면 Holder
에 유형 매개 변수가 있으므로 Holder::new
으로 호출하면 컴파일러에서 오류가 발생하고 new
에는 아무 것도 사용하지 않으므로 컴파일러에서 유형을 유추 할 수 없습니다. 다음
trait FactorCtor {
fn new(factor: int) -> Self;
}
그리고 그 특성 사용 new
을 변경 :
impl<T> Holder<T> where T: Iterator<int>+FactorCtor {
pub fn new(factor : int) -> Holder<T> {
Holder {
x : FactorCtor::new(factor)
}
}
}
우리가 FactorCtor
의 한 구현을 가지고 있기 때문에 이것을 해결하기 위해, 우리는 생성자를 제공하는 특성을 사용하여 일반적인 new
을 만들 수 있습니다 이 프로그램에서는 컴파일러가 Holder::new
을 호출 할 때 T
을 유추 할 수 있습니다. 다른 구현을 추가하면 (예 : Adder
는 :
<anon>:72:9: 72:29 error: unable to infer enough type information about `_`; type annotations required
<anon>:72 let mut three_multiplier = Holder::new(3).get_iterator();
^~~~~~~~~~~~~~~~~~~~
우리는 명시 적으로 T
을 지정하여이 문제를 해결할 수 있습니다 :
fn main() {
let mut three_multiplier = Holder::<Multiplier>::new(3).get_iterator();
for item in three_multiplier {
println!("{}", item);
}
}
을
는
pub struct Adder {
factor : int,
current : int
}
impl FactorCtor for Adder {
fn new(factor: int) -> Adder {
Adder {
factor: factor,
current: 0
}
}
}
impl Iterator<int> for Adder {
fn next(&mut self) -> Option<int> {
if self.current > 10 {
None
}
else {
let current = self.current;
self.current += 1;
Some(current + self.factor)
}
}
}
그런 다음 우리는 컴파일러 오류