Aside from the GAT version not dyn compatible, I don't see any difference between usages of 2 trait definitions.
pub trait Visitor<'a> {
type Node: TreeNode;
type Iter: Iterator<Item = &'a Self::Node> + 'a
where
Self::Node: 'a,
Self: 'a;
fn visit(&'a self, node: &'a Self::Node) -> Self::Iter;
}
pub trait Visitor2 {
type Node: TreeNode;
type Iter<'a>: Iterator<Item = &'a Self::Node> + 'a
where
Self::Node: 'a,
Self: 'a;
fn visit<'a>(&'a self, node: &'a Self::Node) -> Self::Iter<'a>;
}
struct MyVisitor<T>(PhantomData<T>);
impl<'a, T: TreeNode> Visitor<'a> for MyVisitor<T> {
type Node = T;
type Iter
= impl Iterator<Item = &'a Self::Node>
where
Self::Node: 'a,
Self: 'a;
fn visit(&'a self, node: &'a Self::Node) -> Self::Iter {
node.children()
}
}
impl<T: TreeNode> Visitor2 for MyVisitor<T> {
type Node = T;
type Iter<'a>
= impl Iterator<Item = &'a Self::Node>
where
Self::Node: 'a,
Self: 'a;
fn visit<'a>(&'a self, node: &'a Self::Node) -> Self::Iter<'a> {
node.children()
}
}