【问题标题】:Pass arrays of different length to generic function in Rust将不同长度的数组传递给 Rust 中的泛型函数
【发布时间】:2022-12-17 23:37:42
【问题描述】:

我正在尝试将数组数组传递给 Rust 中的通用函数,但是我在这样做时遇到了麻烦。

这是我的代码:

pub const T: [[u8; 3]; 2] = [[0, 1, 0], [1, 1, 1]];
pub const L: [[u8; 3]; 2] = [[0, 0, 1], [1, 1, 1]];
pub const S: [[u8; 2]; 2] = [[1, 1], [1, 1]];

pub fn insert_shape<T: Iterator>(&mut self, shape: T)
    {
        for (i, item) in shape.iter().enumerate()
        {
            for (j, element) in item.iter().enumerate()
            {
                self.board.set_element(i, j, element);
            }
        }
    }


这给了我一个错误,说类型 T 没有一个叫做 iter 的方法。我怎样才能解决这个问题?

【问题讨论】:

  • 最简单的方法是传递数组。
  • @ChayimFriedman 没错,但是我的数组大小不同,有没有办法在不使用泛型的情况下传递数组?也许使用指针之类的?
  • 常量泛型?
  • 如果没有某种形式的泛型,我无法想到。

标签: rust


【解决方案1】:

可能最好只使用数组:

pub fn insert_shape<const W: usize, const H: usize, T>(&mut self, shape: [[T;W];H]) {
    for (i, item) in shape.iter().enumerate() {
        for (j, element) in item.iter().enumerate() {
            self.board.set_element(i, j, element);
        }
    }
}

如果你真的想要,你也可以将迭代器的项目限制为 IntoIterator 本身。

pub fn insert_shape<I>(&mut self, shape: I)
where
    I: IntoIterator,
    I::Item: IntoIterator,
{
    for (i, item) in shape.into_iter().enumerate() {
        for (j, element) in item.into_iter().enumerate() {
            self.board.set_element(i, j, element);
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-11
    • 1970-01-01
    • 1970-01-01
    • 2011-02-20
    相关资源
    最近更新 更多