gpt4 book ai didi

rust - 如何在不装箱的情况下从函数返回一个使用 `impl Trait` 的对象数组?

转载 作者:行者123 更新时间:2023-11-29 08:13:56 26 4
gpt4 key购买 nike

我正在实现一个数独 crate ,我想允许更高维数独的可能性。在 2 维中,有 3 个组需要检查正确性(素数规则仅包含 3 个子规则)并且位置(根据定义)仅需要 2 个坐标即可完全指定,但在更高的维度中,这明显增加。

我编写了以下方法签名,但它不起作用,并且由于我正在开发的环境,我想不惜一切代价避免装箱。

pub fn groups(position: [u8; DIMENSIONS]) -> [impl Group; DIMENSIONS + 1]

每个组的实际类型将在编译时知道(实际类型将类似于[Box, Stack, Band]),但看起来编译器不喜欢这样即使它会知道每个元素的大小。

我希望能够使用在编译时确定大小的元组,但这似乎不容易得到支持,除非我遗漏了什么。


想法是有three types of Group :一个Stack(列),一个Band(行),和一个BoxGroup 的定义如下。

pub trait Group {
/// A group is considered valid if it has contains only unique elements.
fn is_valid(&self) -> bool { /* Default implementation elided. */ }
/// Returns an owned copy of the group's constituent elements.
fn elements(&self) -> Vec<Option<Element>>;
}

让我们从二维情况开始。对于给定的元素,我们可以将元素的索引写为 double (即二元组)(x, y)。与此元素关联的组是一个 Box(一如既往;这是 DIMENSION + 1 的来源)、一个 Stack 和一个

在三维中,给定元素(根据定义)由三元组(即 3 元组)(x, y, z) 索引。与此元素关联的组是一个 Box、一个 Stack两个 Band

这种趋势会持续到更高的维度,我想让用户能够使用不同的维度——从而在编译时确定大小。

为了检查拼图的正确性,调用者只需在每个 puzzle.groups() 上调用 Group::is_valid();他们还可以迭代每个以适本地呈现拼图。

最佳答案

你不能因为所有impl Trait保证是它是某种实现 Trait 的类型. Rust 中的数组是同类的,每个元素必须是同一类型,但类似于 [impl Group; DIMENSIONS + 1]意味着每个元素都可以是任何类型,只要它实现了 Group。 .

没有更多代码很难说,但这可能可以通过对 Group 的类型进行参数化来实现:

pub fn groups<T: Group>(position: [u8; DIMENSIONS]) -> [T; DIMENSIONS + 1]

现在将有一个 groups() 的实例为每一种 T 单态化的函数它被称为与哪些工具 Group .这导致返回的数组仅固定为该类型,从而使其具有同质性。由于该函数没有 T 类型的参数, T 的类型除非可以从调用站点(例如 let x: [SomeGroup; 3] = groups([...]) )推断出,否则可能无法推断出,因此您需要使用 groups::<SomeGroup>([...]) 显式指定类型.

我不知道这是否正是您想要的,但它传达了您需要将数组设置为某种固定类型的一般想法。即 [T; N]固定为 T[impl Trait; N]意味着每个元素可以是任何实现Trait的类型,这本身就意味着它是一个异构数组,但 Rust 中的数组是同构的。

我不知道你是否也想对常量 DIMENSIONS 进行参数化,这需要 RFC 2000: const generics哪个 AFAIK 尚未实现,即使在夜间也是如此。如果您能够从参数中推断出它,那么您可能不需要它,就像您似乎在做的那样。

pub fn groups<T: Group, const DIMENSIONS: usize>(position: [u8; DIMENSIONS])
-> [T; DIMENSIONS + 1]

关于rust - 如何在不装箱的情况下从函数返回一个使用 `impl Trait` 的对象数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50538625/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com