【问题标题】:Constraining Rust Generics to custom data types将 Rust 泛型约束到自定义数据类型
【发布时间】:2021-09-30 17:45:50
【问题描述】:

考虑我构建的以下结构。这样做的目的 struct 将在 layers 变量中包含以下数据类型之一,可以是 2D Vector of Networks,或一维网格向量。我最初的计划是将 layers 变量设置为枚举(如下所示),但是我想在设置后附加到枚举中的值 - 我别 认为枚举允许不复制?

这让我想到了我的问题:如何将 layers 定义为 通用值并将其限制为仅允许 2D 向量 网络,还是一维网格向量?即使与 枚举是可能的,我想使用泛型会更干净。

 pub(crate) struct Mapping {
     layers: NodeDefinition
 }
 
 impl Mapping {
     pub(crate) fn new(node_definition: NodeDefinition) -> Mapping {
         Mapping {
             layers: node_definition
         }
     }
 }
 
 pub(crate) enum NodeDefinition {
     NODE(Vec<Vec<Network>>),
     LEAF(Vec<Mesh>),
 }

【问题讨论】:

  • 我认为枚举是正确的选择,当然你可以改变枚举的内容,只要你有可变的访问权限。
  • 一些旁注:枚举变体默认为大驼峰式。将二维数组表示为 Vec&lt;Vec&lt;...&gt;&gt; 并不是最有效的方法 - 通常最好使用平面 Vec&lt;...&gt; 并提供合适的访问方法,因此您可以使用两个索引对其进行索引。
  • 谢谢,很高兴知道我在枚举的正确轨道上。拥有 1D vec 会更有效也是有道理的。

标签: generics rust enums


【解决方案1】:

一段时间后,我设法让解决方案发挥作用。解决方案是定义一个“虚拟”特征,目前什么都不做(但将来会做)。后来我将类型定义为实现虚拟特征的泛型。这是其中的一些代码:

下面的解决方案将泛型类型“T”限制为节点或网格。

pub(crate) struct Network<T> {
    guid: Uuid,
    input: bool,
    output: bool,
    subnet: T,
}

impl<T: Subnet> Network<T> {
    pub(crate) fn new(subnet: T) -> Network<T> {
        Network {
            guid: Uuid::new_v4(),
            input: true,
            output: true,
            subnet,
        }
    }
}

//// Concerned with Mesh Struct
pub(crate) struct Mesh {
}

impl Subnet for Mesh {}

impl Mesh {
    pub(crate) fn new() -> Mesh {
        Mesh {
        }
    }
}

/// Concerned with Node Struct
pub(crate) struct Node {
}

impl Subnet for Node {}

impl Node {
    pub(crate) fn new() -> Node {
        Node {
        }
    }
}

【讨论】:

  • 相比枚举有什么优势?
  • 我计划为执行不同指令的节点和网格添加专门的功能。据我所知,枚举不允许这样做?第二个原因(只是个人喜好)是我觉得这种语法更简洁。此外,通过特征引用节点和网格值不需要 .borrow_mut 运算符,这只会让我的代码更简洁一些。我绝不是 rust 的“专家”,但这些都是我理解的好处。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-21
  • 1970-01-01
  • 2020-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多