如何在Rust中的构造函数中创建数组

时间:2016-03-16 06:11:43

标签: arrays rust calloc

我想将一些代码从C迁移到Rust用于学习目的,并使我的学习库更加多语言化。

问题是我知道有一种方法可以将C库集成到Rust中。这样我可以在Rust中使用calloc来允许使用在运行时指定的范围创建我的数组。

但是我不想在这里使用calloc - 我希望看到Rust方式。但我真的不想使用vec!;我以前遇到过一些愚蠢的问题所以我现在还不想用它。

以下是代码:

pub struct Canvas {
    width: usize,
    height: usize,
    array: [char], // I want to declare its type but not its size yet
}

impl Canvas{
    pub fn new (&self, width: usize, height: usize) -> Canvas {
        Canvas {
            width: width,
            height: height,
            array: calloc(width, height), // alternative to calloc ?            }
    }
}

我希望我的问题仍然适用于Rust的代码方式。

2 个答案:

答案 0 :(得分:5)

首先,我深深怀疑你不想要char;我假设你想要一个“字节数组”,在这种情况下你需要u8

其次,你不能像这样使用[u8]。我不打算进入为什么因为那只会破坏答案。现在:如果你看到某个引用或指针后面的不是[T],那么可能是错误。

最后,这是Vec的用途;用它。你说你不想使用它,但没有说明原因。 Vec 如何在Rust中分配动态大小的数组。如果您正在尝试分配一个与C中完全相同的结构兼容的结构,那么问题会发生很大变化,您应该明确这一点。

假设你想要的是在C中执行它的“Rust等效”:

pub struct Canvas {
    width: usize,
    height: usize,
    array: Vec<u8>,
}

impl Canvas {
    pub fn new(width: usize, height: usize) -> Canvas {
        Canvas {
            width: width,
            height: height,
            array: vec![0; width*height],
        }
    }
}

答案 1 :(得分:5)

  

我想访问坐标样式

的数组

这样的东西?

pub struct Canvas {
    width: usize,
    height: usize,
    data: Vec<u8>,
}

impl Canvas {
    pub fn new(width: usize, height: usize) -> Canvas {
        Canvas {
            width: width,
            height: height,
            data: vec![0; width*height],
        }
    }

    fn coords_to_index(&self, x: usize, y: usize) -> Result<usize, &'static str> {
        if x<self.width && y<self.height {
            Ok(x+y*self.width)
        } else {
            Err("Coordinates are out of bounds")
        }
    }

    pub fn get(&self, x: usize, y: usize) -> Result<u8, &'static str> {
        self.coords_to_index(x, y).map(|index| self.data[index])
    }

    pub fn set(&mut self, x: usize, y: usize, new_value: u8) -> Result<(), &'static str>{
        self.coords_to_index(x, y).map(|index| {self.data[index]=new_value;})
    }
}

fn main() {
    let mut canvas = Canvas::new(100, 100);
    println!("{:?}", canvas.get(50, 50)); // Ok(0)
    println!("{:?}", canvas.get(101, 50)); // Err("Coordinates are out of bounds")
    println!("{:?}", canvas.set(50, 50, 128)); // Ok(())
    println!("{:?}", canvas.set(101, 50, 128)); // Err("Coordinates are out of bounds")
    println!("{:?}", canvas.get(50, 50)); // Ok(128)
}