[英]Complex trait requirements on struct
我设置了一个相当复杂的特征,但在整理这些片段时遇到了麻烦。 现在看起来大概是这样的:
/// Trait for models which can be gradient-optimized.
pub trait Optimizable {
type Data;
type Target;
// The contract //
}
/// Trait for optimization algorithms.
pub trait OptimAlgorithm<M : Optimizable> {
// The contract //
}
现在,我希望能够将实现OptimAlgorithm
的结构作为实现Optimizable
的结构中的字段。 看起来像这样:
/// Model struct
pub struct Model<A: OptimAlgorithm<Self>> {
alg: A,
}
impl Optimizable for Model<A> {
...
}
这不起作用,因为结构上的Self
引用是胡说八道。 我尝试将关联类型用于OptimAlgorithm
但是我需要算法在模型上通用,因此无法正常工作。 我是否缺少魔术语法,或者这需要大修吗?
编辑-
只需使用Model<A>
代替Self
。 Self
仅在需要能够引用实现该特征的具体类型的特征中才真正有用。 在这里,具体类型始终为Model<A>
。
pub trait Optimizable {
type Data;
type Target;
// The contract //
}
/// Trait for optimization algorithms.
pub trait OptimAlgorithm<M: Optimizable> {
// The contract //
}
pub struct Model<A> where A: OptimAlgorithm<Model<A>> {
alg: A,
}
impl<A> Optimizable for Model<A>
where A: OptimAlgorithm<Model<A>>
{
type Data = ();
type Target = ();
}
为了响应您更新的代码,生命周期似乎给生锈带来了麻烦。 看来您可以通过使用排名较高的生命周期来完成这项工作,但我不知道为什么。
pub trait Optimizable {
type Data;
type Target;
// The contract //
}
/// Trait for optimization algorithms.
pub trait OptimAlgorithm<M: Optimizable> {
// The contract //
}
pub struct Algorithm;
impl Default for Algorithm {
fn default() -> Algorithm { Algorithm }
}
impl<M: Optimizable> OptimAlgorithm<M> for Algorithm {
}
pub struct Model<'a, A> where for<'b> A: OptimAlgorithm<Model<'b, A>> {
layer_sizes: &'a [usize],
alg: A,
}
impl<'a, A> Model<'a, A>
where A: for<'b> OptimAlgorithm<Model<'b, A>>
{
pub fn new(layers: &'a [usize]) -> Model<Algorithm> {
Model {
layer_sizes: layers,
alg: Algorithm::default(),
}
}
}
impl<'a, A> Optimizable for Model<'a, A>
where A: for<'b> OptimAlgorithm<Model<'b, A>>
{
type Data = ();
type Target = ();
}
pub fn main() {
let layers = &[1usize,2,3];
let a = Model::<Algorithm>::new(layers as &[usize]);
}
我认为这是一个错误。 或至少令人惊讶的行为。 如果取消了Model
结构上的where
界限(并将其保留在impl
),则将编辑已编辑的代码。 我会尽力减少一些错误。
pub trait Optimizable {
type Data;
type Target;
// The contract //
}
/// Trait for optimization algorithms.
pub trait OptimAlgorithm<M: Optimizable> {
// The contract //
}
pub struct Algorithm;
impl Default for Algorithm {
fn default() -> Algorithm { Algorithm }
}
impl<M: Optimizable> OptimAlgorithm<M> for Algorithm {
}
pub struct Model<'a, A> { // no bounds here
layer_sizes: &'a [usize],
alg: A,
}
impl<'a, A> Model<'a, A>
where A: OptimAlgorithm<Model<'a, A>>
{
pub fn new(layers: &[usize]) -> Model<Algorithm> {
Model {
layer_sizes: layers,
alg: Algorithm::default(),
}
}
}
impl<'a, A> Optimizable for Model<'a, A>
where A: OptimAlgorithm<Model<'a, A>>
{
type Data = ();
type Target = ();
}
pub fn main() {
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.