相关疑难解决方法(0)

如何在Rust中将切片作为数组?

我有一个未知大小的数组,我想获得该数组的一部分并将其转换为静态大小的数组:

fn pop(barry: &[u8]) -> [u8; 3] {
    barry[0..3] // mismatched types: expected `[u8, ..3]` but found `&[u8]`
}
Run Code Online (Sandbox Code Playgroud)

我该怎么做?

arrays rust

36
推荐指数
5
解决办法
2万
查看次数

如何从"Box"中获取自有值?

这个函数的实现是什么:

fn unbox<T>(value: Box<T>) -> T {
    // ???
}
Run Code Online (Sandbox Code Playgroud)

文档中唯一看起来像我想要的功能Box::into_raw.以下将进行类型检查:

fn unbox<T>(value: Box<T>) -> T {
    *value.into_raw()
}
Run Code Online (Sandbox Code Playgroud)

这给出了错误error[E0133]: dereference of raw pointer requires unsafe function or block.将其包装在一个unsafe { ... }块中可以修复它.

fn unbox<T>(value: Box<T>) -> T {
    unsafe { *value.into_raw() }
}
Run Code Online (Sandbox Code Playgroud)

这是正确的实施吗?如果是这样,为什么它不安全?这是什么意思?

也许这个问题显示了我对如何Box实际工作的一般不确定性.

unsafe rust

20
推荐指数
1
解决办法
1万
查看次数

是否可以使用泛型的类型参数来控制数组的大小?

以下内容仅用作示例,而不是有效的Rust代码.

struct Vec<T: Sized, Count> {
    a: [T; Count]
}
Run Code Online (Sandbox Code Playgroud)

在C++模板中可能有类似的东西,但我还没有在Rust中看到它.

rust

19
推荐指数
2
解决办法
3023
查看次数

将向量转换为数组并返回

我试图找出从矢量转换为数组并返回的最类似Rust的方式.这些宏可以工作,甚至可以通过一些不安全的块来制作通用,但它们都觉得非常不像Rust.

我会很感激任何输入并且没有任何打击,我认为这段代码远非好或不优.我现在只玩Rust几周了,追逐发布和文档,所以非常感谢帮助.

macro_rules! convert_u8vec_to_array {
    ($container:ident, $size:expr) => {{
    if $container.len() != $size {
            None
    } else {
        use std::mem;
        let mut arr : [_; $size] = unsafe { mem::uninitialized() };
        for element in $container.into_iter().enumerate() {
            let old_val = mem::replace(&mut arr[element.0],element.1);
            unsafe { mem::forget(old_val) };
        }
        Some(arr)
        }
    }};
}

fn array_to_vec(arr: &[u8]) -> Vec<u8> {
     let mut vector = Vec::new();
     for i in arr.iter() {
         vector.push(*i);
     }
     vector
}

fn vector_as_u8_4_array(vector: Vec<u8>) -> [u8;4] {
    let mut arr = …
Run Code Online (Sandbox Code Playgroud)

rust

10
推荐指数
1
解决办法
2万
查看次数

如何在不复制元素的情况下将 Vec 转换为数组?

我有一些Vec不平凡的类型,其大小我确定。我需要将其转换为固定大小的数组。理想情况下我想这样做

  1. 无需复制数据 - 我想使用Vec
  2. 无需用零数据预初始化数组,因为这会浪费 CPU 周期

问题写成代码:

struct Point {
    x: i32,
    y: i32,
}

fn main() {
    let points = vec![
        Point { x: 1, y: 2 },
        Point { x: 3, y: 4 },
        Point { x: 5, y: 6 },
    ];

    // I would like this to be an array of points
    let array: [Point; 3] = ???;
}
Run Code Online (Sandbox Code Playgroud)

这似乎是一个微不足道的问题,但是我无法在Vec文档、Rust Books 的切片部分或通过谷歌搜索中找到令人满意的解决方案。我发现的唯一一件事是首先用零数据初始化数组,然后从 复制所有元素Vec,但这不能满足我的要求。

arrays vector rust

6
推荐指数
1
解决办法
1万
查看次数

如何连接已知长度的数组?

我有两个已知长度的数组:

let left: [u8; 2] = [1, 2];
let right: [u8; 3] = [3, 4, 5];
Run Code Online (Sandbox Code Playgroud)

我的第一次尝试:

let whole: [u8; 5] = left + right;
Run Code Online (Sandbox Code Playgroud)

失败并出现错误:

error[E0369]: cannot add `[u8; 2]` to `[u8; 3]`
  --> /home/fadedbee/test.rs:25:29
   |
25 |         let whole: [u8; 5] = left + right;
   |                              ---- ^ ----- [u8; 3]
   |                              |
   |                              [u8; 2]
Run Code Online (Sandbox Code Playgroud)

同样地:

let whole: [u8; 5] = left.concat(right);
Run Code Online (Sandbox Code Playgroud)

失败:

error[E0599]: the method `concat` exists for array `[u8; 2]`, but its trait bounds were …
Run Code Online (Sandbox Code Playgroud)

arrays concatenation rust

6
推荐指数
2
解决办法
469
查看次数

如何将任意长度的 Vec&lt;T&gt; 的所有条目加载到堆栈上?

我目前正在处理向量,并试图确保我在堆栈上拥有本质上是向量数组的内容。我无法调用,Vec::into_boxed_slice因为我正在动态分配Vec. 这是可能吗?

阅读了关于如何实现的VecRustonomicon 后,它似乎跨越了堆上的指针,在每个条目处取消引用。我想将Vec堆中的条目分块到堆栈中以便快速访问。

vector heap-memory rust stack-allocation

-2
推荐指数
1
解决办法
222
查看次数