< 返回版块

cyh0 发表于 2021-05-21 14:41

public class Vector<T>{
    private T[] data;

    public Vector new(int capacity) {
        // 由于java的泛型,编译不过,当作类似java的伪代码就行
        data = new T[capacity];
    }
}

萌新在rust中写不出来

评论区

写评论
作者 cyh0 2021-05-21 18:03

感谢。

--
👇
Aya0wind: 用指针呗,手动分配,Rust目前分配运行时长度数组的方式就是标准库的Vec,你不想套娃实现,那就是按标准库Vec的写法造一个差不多的轮子。

struct MyVector<T> {
    array: *mut T,
    len: usize,
    capacity: usize,
}

impl<T> MyVector<T> {
    pub fn new(capacity: usize) -> Self {
        use std::alloc::alloc;
        let layout = Layout::array::<T>(capacity).unwrap();
        unsafe {
            Self {
                array: alloc(layout) as *mut T,
                capacity,
                len: 0,
            }
        }
    }
}

用rust写自己的Vec有详细的教程,比如这个实现 Vec,但是这篇文章还是我入门的时候看的,稍微有点老了,感兴趣的话直接看标准库的源代码,还蛮好读的。

作者 cyh0 2021-05-21 18:02

感谢,我大概知道一些了,这个方法的确可以,就是new的时候把capacity作为泛型的一个参数传递,但是无法将const capacity:usize作为函数的参数传递。

--
👇
uno:

struct Vector<T, const N: usize> {
    data: [T; N],
}

impl<T: Default + Copy, const N: usize> Vector<T, N> {
    pub fn new() -> Self {
        Vector { data: [Default::default(); N] }
    }
}
Aya0wind 2021-05-21 16:58

用指针呗,手动分配,Rust目前分配运行时长度数组的方式就是标准库的Vec,你不想套娃实现,那就是按标准库Vec的写法造一个差不多的轮子。

struct MyVector<T> {
    array: *mut T,
    len: usize,
    capacity: usize,
}

impl<T> MyVector<T> {
    pub fn new(capacity: usize) -> Self {
        use std::alloc::alloc;
        let layout = Layout::array::<T>(capacity).unwrap();
        unsafe {
            Self {
                array: alloc(layout) as *mut T,
                capacity,
                len: 0,
            }
        }
    }
}

用rust写自己的Vec有详细的教程,比如这个实现 Vec,但是这篇文章还是我入门的时候看的,稍微有点老了,感兴趣的话直接看标准库的源代码,还蛮好读的。

uno 2021-05-21 16:41
struct Vector<T, const N: usize> {
    data: [T; N],
}

impl<T: Default + Copy, const N: usize> Vector<T, N> {
    pub fn new() -> Self {
        Vector { data: [Default::default(); N] }
    }
}

--
👇
cyh0: 我听过这个名词,但搞不懂。

作者 cyh0 2021-05-21 16:28

我听过这个名词,但搞不懂。

--
👇
uno: Const generics

作者 cyh0 2021-05-21 15:42

我就是想实现一个Vec,这就套娃了,只能手动在堆中分配。

--
👇
GipsyU: struct test{ data:Vec, } impl test{ fn new(&mut self)->&Vec { self.data = Vec::new(); &self.data } }

GipsyU 2021-05-21 15:39

struct test{ data:Vec, } impl test{ fn new(&mut self)->&Vec { self.data = Vec::new(); &self.data } }

uno 2021-05-21 15:03

Const generics

作者 cyh0 2021-05-21 14:58

至少在目前是不行的。

--
👇
cyh0: 我晓得了,这是不行的,必须在编译期确定数组的大小。

作者 cyh0 2021-05-21 14:57

我晓得了,这是不行的,必须在编译期确定数组的大小。

1 共 10 条评论, 1 页