특성에 체인 가능한 변환을 시도하고 있는데 문제가 있습니다.특성에 대한 체인 기능
나는 형태로의 변환 기능의 무리가 있습니다
fn transform<T: MyTrait>(in: T) -> impl MyTrait
을 그리고 수 있도록하는 기능 chain
나를 내가 쓴이 기능을
let mut val: Box<MyTrait> = ...;
val = chain(val, transform1);
val = chain(val, transform2);
...
을 수행 할
fn chain<T, U, F>(val: Box<T>, f: F) -> Box<MyTrait>
where T: MyTrait,
U: MyTrait,
F: FnOnce(T) -> U {
Box::new(f(*val))
}
하지만 컴파일 할 때 borrow checker는 타입 매개 변수 U 충분히 오래 살지 않습니다. 나는 나의 특성 경계가 내가 원하는 바라고 확신하고 평생 지시자를 가지고 여러 가지를 시도 했으므로 나는 걸림돌이되었다. (
추신 : 기능을 MyTrait
에 일반화 할 수 있습니까? 생각하지 않는다
... 편집이 가능하지만, 우리는 결코 알지 못할 :
내가에서 말했듯에 의해 그의 대답에 @ 크리스 - 에머슨에 의해 제안 된 수정, 추가 한의 의견, 내가 해결할 수없는 것 같은 다른 문제를 밝혀냈다.
Here은이 요령을 복잡하게하지 않기 위해 코드의 요지입니다. 요컨대
이 문제는 다음과 체인 함수 Box<T>
오브젝트 참조 해제해야하고 변환 함수에 T
통과하므로 T
는 Sized
이어야한다. 그러나이 기능의 요점은 컴파일 타임에 임의의 (그리고 알려지지 않은) MyTrait
구현을 사용하는 것이 었습니다. 예를 들어 : 변환 함수는 & T 또는 & MUT T를 취할 수없는
let mut val: Box<MyTrait> = ...;
//here we can know the type inside the Box
if ... {
val = chain(val, transform);
}
//but here we don't know anymore
//(its either the original type,
//or the type returned by transform)
그래서이 디자인이 작동하지 않을 수 있습니다 (이 할 수없는, 내가 출력을 생성하기 위해 입력을 소비해야하므로) .
나는 'T'와 'U'가 다른 형질이라고 생각합니까? – LinearZoetrope
@ Jsor : 아마도 'F'는 여기의 변압기이기 때문일 것입니다. –
@MatthieuM. 나는 그들이 실제로 같은 형질의 두 가지 구현 사이에서 변환하고 그것을 boxed trait 객체로 변환하기를 원한다고 생각하고있다. – LinearZoetrope