#What is the difference between using GATs and define generic lifetime on trait?

2 messages · Page 1 of 1 (latest)

cedar vector
#

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()
    }
}
rocky heath