< 返回版块

curtainp 发表于 2021-08-26 19:05

Tags:trait impl

impl<'c, C: ?Sized + Completer> Completer for &'c C {
    type Candidate = C::Candidate;

    fn complete(
        &self,
        line: &str,
        pos: usize,
        ctx: &Context<'_>,
    ) -> Result<(usize, Vec<Self::Candidate>)> {
        (**self).complete(line, pos, ctx)
    }

    fn update(&self, line: &mut LineBuffer, start: usize, elected: &str) {
        (**self).update(line, start, elected)
    }
}

这种套娃实现trait的方式如何理解啊, 师傅们有了解的吗

评论区

写评论
作者 curtainp 2021-08-28 12:13

恩 明白了 感谢感谢😁

--
👇
johnmave126: 如果说是这个pattern的例子的话就是std::cmp::Eq

Eq也有个实现是impl<'a, T> Eq for &'a T where T: Eq,设想一下假如没有这个实现。如果我自己写了一个类型A, 实现了Eq,那么我可以

let a = A;
let b = A;

a == b

但是我就不可以

let a = A;
let b = A;

&a == &b

因为&A并没有实现Eq。这个“套娃”实现主要就是让引用也可以直接用。

--
👇
curtainp: 方便举个例子嘛

--
👇
johnmave126: 不算套娃吧,本质上是让Completer的引用也被认为是Completer,主要的作用是方便传递进泛型函数吧

johnmave126 2021-08-28 05:16

如果说是这个pattern的例子的话就是std::cmp::Eq

Eq也有个实现是impl<'a, T> Eq for &'a T where T: Eq,设想一下假如没有这个实现。如果我自己写了一个类型A, 实现了Eq,那么我可以

let a = A;
let b = A;

a == b

但是我就不可以

let a = A;
let b = A;

&a == &b

因为&A并没有实现Eq。这个“套娃”实现主要就是让引用也可以直接用。

--
👇
curtainp: 方便举个例子嘛

--
👇
johnmave126: 不算套娃吧,本质上是让Completer的引用也被认为是Completer,主要的作用是方便传递进泛型函数吧

Bai-Jinlin 2021-08-27 17:40

没什么太复杂的地方,假如你为i32实现了这个Completer的话,你发的这个代码就是为&i32实现Completer,这是你代码中的&self指的是&&i32类型,(**self).complete(line, pos, ctx)这个代码就是解两次引用成i32,然后因为complete参数是&self又发生了自动引用,我感觉你这个代码改成(*self).complete(line, pos, ctx)也没什么问题。

作者 curtainp 2021-08-27 10:44

方便举个例子嘛

--
👇
johnmave126: 不算套娃吧,本质上是让Completer的引用也被认为是Completer,主要的作用是方便传递进泛型函数吧

johnmave126 2021-08-27 01:37

不算套娃吧,本质上是让Completer的引用也被认为是Completer,主要的作用是方便传递进泛型函数吧

1 共 5 条评论, 1 页