【发布时间】:2020-12-31 09:46:40
【问题描述】:
我在尝试 Rust 时偶然发现了一个问题,这可能表明我对它的概念有更大的不理解。
我的目标是编写康威生命游戏的变体。我希望在创建单元格或保持活动状态时的值不是硬编码,而是在结构中。我的第一次尝试是创建一个结构
use std::ops::Range;
struct Rules {
be_born: Range<usize>,
stay_alive: Range<usize>,
}
impl Rules {
pub fn new(be_born: Range<usize>, stay_alive: Range<usize>) -> Rules {
Rules { be_born, stay_alive }
}
}
let rules = Rules::new(2..4, 3..6);
此对象稍后在迭代所有单元格的算法中使用。它工作正常,直到我还想在创建过程中允许其他类型的范围,例如 RangeTo (2..=3)。
我知道我可以将struct Rules 重写为通用的。
use std::ops::RangeBounds;
struct Rules<BR: RangeBounds<usize>, AR: RangeBounds<usize>> {
be_born: BR,
stay_alive: AR,
}
这反过来又会迫使我使我使用的所有算法也变得通用。仅仅包含两个简单的范围,这似乎是相当多的开销。
另一方面,我将RangeBounds 类型的变量直接包含到我的结构中的尝试都没有成功。我尝试了&dyn RangeBounds<usize> 或Box<&dyn RangeBounds<usize>>,只是为了始终得到错误 E0038,即我无法将此特征转化为对象。
还有其他方法可以完成这项工作,还是有其他我看不到的可行方法?
提前感谢您的所有提示。
【问题讨论】:
-
不要使用 RangeBounds 作为类型,而是尝试使用它作为边界:
struct Rules<T: RangeBounds> {be_born: T, stay_alive: T} -
@IvanC 你不能。它需要有一个泛型类型参数,或者作为 struct
Rules的另一个泛型参数 - 这涉及使用PhantomData- 或作为像usize这样的 const 参数。
标签: rust trait-objects