我是新来的 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相同。
1条答案
按热度按时间zd287kbt1#
这称为
Deref
强制您可以在此处阅读更多信息
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