如何将切片转换为数组引用?

时间:2018-01-06 16:50:03

标签: arrays rust slice

我有一个&[u8],并希望将其转换为&[u8; 3]而不进行复制。它应该引用原始数组。我怎么能这样做?

3 个答案:

答案 0 :(得分:7)

从Rust 1.34开始,您可以使用TryFrom / TryInto

use std::convert::TryFrom;

fn example(slice: &[u8]) {
    let array = <&[u8; 3]>::try_from(slice);
    println!("{:?}", array);
}

fn example_mut(slice: &mut [u8]) {
    let array = <&mut [u8; 3]>::try_from(slice);
    println!("{:?}", array);
}

答案 1 :(得分:6)

重新强调一下,这可以在没有不安全代码的情况下完成,因为直到运行时才知道切片中有三个元素。

fn slice_to_arr3<T>(slice: &[T]) -> Option<&[T; 3]> {
    if slice.len() == 3 {
        Some(unsafe { &*(slice as *const [T] as *const [T; 3]) })
    } else {
        None
    }
}

在实现const generics之前,这在数组长度上是通用的。

答案 2 :(得分:6)

他们arrayref crate实现了这一点。

以下是一个例子,你当然可以用不同的方式使用它:

import javax.swing.*;
import java.awt.*;

public class Designer extends JFrame {

static JFrame f = new Designer();

JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
DrawingPanel drawingPanel = new DrawingPanel();
PropertyPanel propertyPanel = new PropertyPanel();

 public Designer(){

    Rectangle bounds = GraphicsEnvironment
            .getLocalGraphicsEnvironment()
            .getMaximumWindowBounds();

    splitPane.setTopComponent(propertyPanel);
    splitPane.setBottomComponent(drawingPanel);

    add(splitPane, BorderLayout.CENTER);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(bounds);
    setVisible(true);

 }

 public static void main(String[] args) {
    System.out.println("App started...");
 }
}