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的方式如何理解啊, 师傅们有了解的吗
1
共 5 条评论, 1 页
评论区
写评论恩 明白了 感谢感谢😁
--
👇
johnmave126: 如果说是这个pattern的例子的话就是
std::cmp::Eq
吧Eq
也有个实现是impl<'a, T> Eq for &'a T where T: Eq
,设想一下假如没有这个实现。如果我自己写了一个类型A
, 实现了Eq
,那么我可以但是我就不可以
因为
&A
并没有实现Eq
。这个“套娃”实现主要就是让引用也可以直接用。--
👇
curtainp: 方便举个例子嘛
--
👇
johnmave126: 不算套娃吧,本质上是让Completer的引用也被认为是Completer,主要的作用是方便传递进泛型函数吧
如果说是这个pattern的例子的话就是
std::cmp::Eq
吧Eq
也有个实现是impl<'a, T> Eq for &'a T where T: Eq
,设想一下假如没有这个实现。如果我自己写了一个类型A
, 实现了Eq
,那么我可以但是我就不可以
因为
&A
并没有实现Eq
。这个“套娃”实现主要就是让引用也可以直接用。--
👇
curtainp: 方便举个例子嘛
--
👇
johnmave126: 不算套娃吧,本质上是让Completer的引用也被认为是Completer,主要的作用是方便传递进泛型函数吧
没什么太复杂的地方,假如你为i32实现了这个Completer的话,你发的这个代码就是为&i32实现Completer,这是你代码中的&self指的是&&i32类型,
(**self).complete(line, pos, ctx)
这个代码就是解两次引用成i32,然后因为complete参数是&self又发生了自动引用,我感觉你这个代码改成(*self).complete(line, pos, ctx)
也没什么问题。方便举个例子嘛
--
👇
johnmave126: 不算套娃吧,本质上是让Completer的引用也被认为是Completer,主要的作用是方便传递进泛型函数吧
不算套娃吧,本质上是让Completer的引用也被认为是Completer,主要的作用是方便传递进泛型函数吧