【问题标题】:In Rust, how do you create a slice that is backed by a tuple?在 Rust 中,如何创建一个由元组支持的切片?
【发布时间】:2015-01-27 09:42:07
【问题描述】:

假设我在堆栈上有一些元组:

let a:(u8,u8,u8) = (1,2,3);

如何将切片创建为全部或部分?

【问题讨论】:

  • 注意,我在下面部分回答了我自己的问题,但如果有人真的知道恰好是同构类型的元组的答案,我会接受他们的答案。

标签: tuples rust slice


【解决方案1】:

在大多数情况下,这样做没有意义。元组和相同大小的固定大小数组的主要区别在于元组支持异构元素,而数组包含相同类型的元素。切片是指向内存中连续的相同类型值数组的胖指针,因此虽然它们可能对某些元组有意义,但它们通常没有意义,因此元组不支持切片操作。

【讨论】:

    【解决方案2】:

    Rust 引用 defines 元组具有连续的布局和定义的顺序,因此您可以将指针指向元组的第一个元素并将其转换为切片:

    #![feature(tuple_indexing)]
    
    use std::slice;
    
    fn main() {
        let t = (1u8, 2u8, 3u8);
        let f: *const u8 = &t.0;
        let s = unsafe { slice::from_raw_buf(&f, 3) };
        println!("{}", s);  // [1, 2, 3]
    }
    

    还有this RFC,但很早以前就关闭了。

    【讨论】:

    • 谢谢!我认为这将涉及不安全......除了帮助阻止人们这样做之外,这是一个很好的例子,说明了如何做一些基本的不安全指针转换。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-12
    • 2016-09-23
    • 1970-01-01
    • 2014-04-16
    • 1970-01-01
    相关资源
    最近更新 更多