gpt4 book ai didi

rust - 为什么我可以将 sort_by_key 与 Vec 一起使用?

转载 作者:行者123 更新时间:2023-11-29 08:10:06 24 4
gpt4 key购买 nike

以这个例子为例

fn main() {

let mut test: Vec<u32> = Vec::new();

test.push(5);
test.push(8);
test.push(0);

test.sort_by_key(|k| k.abs());
}

我搜索了 the source code for Vec ,但我没有看到特征或类似 derive 的东西。

trait SomeTrait {
fn sort_by_key...
}

impl SomeTrait for Vec... { }

我的 IDE 的 IntelliSense 也没有检测到 sort_by_key

我搜索了 Rust Github 并找到了 this implementation in slice.rs :

pub fn sort_by_key<B, F>(&mut self, mut f: F)
where F: FnMut(&T) -> B, B: Ord
{
self.sort_by(|a, b| f(a).cmp(&f(b)))
}

但我看不出 Vec 与切片的关系以及 Vec 如何访问 sort_by_key

我在vec.rs中看到了这个构造函数:

pub fn new() -> Vec<T> {
Vec {
buf: RawVec::new(),
len: 0,
}
}

我浏览了 struct,但我不明白 sort_by_key 的来源。


response by Jascha之后

由于我的英语不是很好,我看不懂文档。我知道通过使用 Deref,实现 Deref 的结构可以访问它所应用的方法,在本例中是一个切片,但也可能是另一个?


我找到了 this url这有助于我理解我的后续问题并可能帮助其他人:

struct Foo;
impl Foo {
fn foo(&self) { }
}

struct Bar {
foo: Foo,
}

impl std::ops::Deref for Bar {
type Target = Foo;

fn deref(&self) -> &Foo {
&self.foo
}
}

fn main() {
let test: Bar = Bar { foo: Foo };
test.foo();
}

我觉得这很酷

最佳答案

正如 Jascha 提到的,Vec<T>工具 Deref<Target=[T]>DerefMut .

注意这里的具体语法:TargetDeref 的关联类型(不是输入)并且实现看起来像:

impl<T> Deref for Vec<T> {
type Target = [T];

// ..
}

事实TargetDeref 的关联类型很重要,因为这意味着 Deref对于任何给定(具体)类型,只能执行一次

反过来,这意味着在解析类型上的方法时,编译器可以轻松应用deref 强制转换。也就是说,只要没有找到给定名称的方法,它就会查看是否可以再次取消引用当前类型并重试(是的,这可以链接)。


在当前情况下,这意味着编译器:

  • 寻找 sort_by_key&mut Vec<T> , 没有
  • 寻找 sort_by_key&mut [T] , 它存在

然后它将调用从:

let mut v = vec![1, 3, 2];
v.sort_by_key(...);

进入:

let mut v = vec![1, 3, 2];
(&mut *v).sort_by_key(...);

自动。

关于rust - 为什么我可以将 sort_by_key 与 Vec 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36437375/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com