Zhanghailin1995 发表于 2021-05-15 21:44
Tags:切片,slice,DST
&[T] 和 Box<[T]>的使用场景有什么区别,平常在使用的时候似乎大部分情况都是&[T]?有没有大佬给解惑
这个最简单的例子就是
let a=[1,2,3]; let b:&[i32]=&a;
这些行为还可以用Unsize和CoerceUnsized来表达,这些具体在nomicon的4.1节有讲,我写了一段代码共你参考。
https://play.rust-lang.org/?version=nightly&edition=2018&gist=3084775bb4595eaa2107f2e29814165d
-- 👇 Zhanghailin1995: 感谢大佬的回复,但是 对于指针类型因为存在着[T; n] => [T]这种类型的coerce,所以可以用[i32]替换[i32;3] 对于这句话我不是很理解,能否举一个具体的场景例子
-- 👇 Bai-Jinlin: &[T]代指的是一块有着确定大小的连续内存空间。
from_raw_parts<'a, T>(data: *const T, len: usize) -> &'a [T]
可以从这个函数的签名中看到,只需要一个原始指针以及对应的长度就可以够造出&[T],所以这个&[T]可以代指任意的内存区域,既可以是栈上的数组,也可以是堆上的Vec。 而Box<[T]>可以这么构造
let s: Box<[i32]> = Box::new([10, 40, 30]);
对于指针类型因为存在着[T; n] => [T]这种类型的coerce,所以可以用[i32]替换[i32;3]。
感谢大佬的回复,但是 对于指针类型因为存在着[T; n] => [T]这种类型的coerce,所以可以用[i32]替换[i32;3] 对于这句话我不是很理解,能否举一个具体的场景例子
Box 有所有权的
Box
&[T]代指的是一块有着确定大小的连续内存空间。
评论区
写评论这个最简单的例子就是
这些行为还可以用Unsize和CoerceUnsized来表达,这些具体在nomicon的4.1节有讲,我写了一段代码共你参考。
https://play.rust-lang.org/?version=nightly&edition=2018&gist=3084775bb4595eaa2107f2e29814165d
--
👇
Zhanghailin1995: 感谢大佬的回复,但是 对于指针类型因为存在着[T; n] => [T]这种类型的coerce,所以可以用[i32]替换[i32;3] 对于这句话我不是很理解,能否举一个具体的场景例子
--
👇
Bai-Jinlin: &[T]代指的是一块有着确定大小的连续内存空间。
可以从这个函数的签名中看到,只需要一个原始指针以及对应的长度就可以够造出&[T],所以这个&[T]可以代指任意的内存区域,既可以是栈上的数组,也可以是堆上的Vec。 而Box<[T]>可以这么构造
对于指针类型因为存在着[T; n] => [T]这种类型的coerce,所以可以用[i32]替换[i32;3]。
感谢大佬的回复,但是 对于指针类型因为存在着[T; n] => [T]这种类型的coerce,所以可以用[i32]替换[i32;3] 对于这句话我不是很理解,能否举一个具体的场景例子
--
👇
Bai-Jinlin: &[T]代指的是一块有着确定大小的连续内存空间。
可以从这个函数的签名中看到,只需要一个原始指针以及对应的长度就可以够造出&[T],所以这个&[T]可以代指任意的内存区域,既可以是栈上的数组,也可以是堆上的Vec。 而Box<[T]>可以这么构造
对于指针类型因为存在着[T; n] => [T]这种类型的coerce,所以可以用[i32]替换[i32;3]。
Box
有所有权的&[T]代指的是一块有着确定大小的连续内存空间。
可以从这个函数的签名中看到,只需要一个原始指针以及对应的长度就可以够造出&[T],所以这个&[T]可以代指任意的内存区域,既可以是栈上的数组,也可以是堆上的Vec。 而Box<[T]>可以这么构造
对于指针类型因为存在着[T; n] => [T]这种类型的coerce,所以可以用[i32]替换[i32;3]。