我想将一些代码从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的代码方式。
答案 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)
}