Rust:Vec是否< T>自动转换为[T]?

gk7wooem  于 2022-11-24  发布在  其他
关注(0)|答案(1)|浏览(130)

我是新来的 rust ,我搞不清与Vec和切片。
下面是我的场景:

fn funA() {
    let v1: Vec<i32> = vec![1, 2, 3];
    funB(&v1);   // question_A
    v1.iter();   // question_B
}

fn funB(slice: &[i32]) {
    // slice type is &[i32] by sure
}
  • 问题A

funB需要类型&[i32](Primitive Type slice的引用),而调用方使用类型&Vec[i32](std::vec::Vec的引用)。这是调用堆栈的一部分,我可以看到有一种deref和Vec as_ptr操作,但不确定它是如何工作的。
是否自动转换?
是否由编译器“优化”?
与Vec.as_slice()有什么区别?

// invoke stack
core::ptr::mut_ptr::<impl *mut T>::is_null (@core::ptr::mut_ptr::<impl *mut T>::is_null:42)
alloc::vec::Vec<T,A>::as_ptr (@<alloc::vec::Vec<T,A> as core::ops::deref::Deref>::deref:19)
<alloc::vec::Vec<T,A> as core::ops::deref::Deref>::deref (@<alloc::vec::Vec<T,A> as core::ops::deref::Deref>::deref:11)
hello_cargo::funA (/Users/path-to-hello_cargo/src/main.rs:15)
...
main (@main:12)
start (@start:639)
  • 问题B

iter()是分片[T]的实现函数,Vec<T>对象v1如何调用v1.iter()
可能与问题A相同。

zd287kbt

zd287kbt1#

这称为Deref强制

/// Vec<T> implements Deref as follows
impl Deref for Vec<T> {
    type Target = &[T];
    fn deref(&self) -> &Self::Target;
}

// meaning you can call
let vector: Vec<T> = ...
let slice: &[T] = vector.deref();

// Rust can call .deref() automatically whenever needed (coercion)

您可以在此处阅读更多信息
https://web.mit.edu/rust-lang_v1.25/arch/amd64_ubuntu1404/share/doc/rust/html/book/first-edition/deref-coercions.html
https://doc.rust-lang.org/std/ops/trait.Deref.html

相关问题