Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何表达通用映射并将容器设置为Rust? 我学习C++背景下的生锈,我在写一个拓扑排序。_Rust_Generic Programming - Fatal编程技术网

如何表达通用映射并将容器设置为Rust? 我学习C++背景下的生锈,我在写一个拓扑排序。

如何表达通用映射并将容器设置为Rust? 我学习C++背景下的生锈,我在写一个拓扑排序。,rust,generic-programming,Rust,Generic Programming,输入是一个类型为map的依赖关系映射,其中每个节点(键)都映射到其依赖关系(一组键)Map和Set可以是任何Map和Set实现。输出是具有排序拓扑顺序的向量 在C++中,我将使用“模板模板参数”来同时使用 MAP和 SET: 模板< K类, 模板类映射, 模板类集 > 向量 拓扑排序(Map const&depmap); 此功能可应用于地图或无序地图或地图等 在Rust中,似乎没有“模板参数”。我可以写以下内容: fn topological_sort<K: Eq + Ord + Has

输入是一个类型为
map
的依赖关系映射,其中每个节点(键)都映射到其依赖关系(一组键)
Map
Set
可以是任何
Map
Set
实现。输出是具有排序拓扑顺序的向量

在C++中,我将使用“模板模板参数”来同时使用<代码> MAP<代码>和<代码> SET:

模板<
K类,
模板类映射,
模板类集
>
向量
拓扑排序(Map const&depmap);
此功能可应用于
地图
无序地图
地图

在Rust中,似乎没有“模板参数”。我可以写以下内容:

fn topological_sort<K: Eq + Ord + Hash + Clone>(depmp: &BTreeMap<K, HashSet<K>>) -> Option<Vec<K>> {
}
fn拓扑排序(depmp:&BTreeMap)->选项{
}
但是就容器选择而言,代码不是通用的,因为它不适用于
HashMap

我尝试了假设的语法:

fn topological_sort<Map, Set, K: Eq + Ord + Hash + Clone>(depmp: &Map::<K, Set::<K>>) -> Option<Vec<K>>
fn拓扑排序(depmp:&Map:)->选项
这是行不通的。一般容器的防锈剂是什么

一般容器的防锈剂是什么

目前还没有通用容器的理想解决方案。这将包含在当前处于实施阶段的功能中

目前,有一些方法可以使您的例程对某些用例通用。特别是,函数通常通过实现迭代器的值来接收任意数据序列:

fn my_number_process<I>(stream: I) -> f32
where
    I: IntoIterator<Item = f32>,
{
    stream.into_iter().map(|x| x * 2. + 5.).sum().unwrap_or(0.)
}
这是因为我们不能将
指定为
&'a V
,其中
'a
是将被实例化为
自身
的生存期。但是,它可以实现为参考
HashMap

trait IMap<K> {
    type Value;

    fn get<B: Borrow<K>>(&self, key: B) -> Option<Self::Value>;
}
impl<'a, K, V> IMap<K> for &'a HashMap<K, V>
where
    K: Eq,
    K: Hash,
{
    type Value = &'a V;

    fn get<B: Borrow<K>>(&self, key: B) -> Option<Self::Value> {
        HashMap::get(self, key.borrow())
    }
}

impl这是我能达到的最接近的目标:

use std::collections::*;
use std::hash::Hash;
use std::ops::Index;

trait Set<K> {
    fn does_contain(&self, value: &K) -> bool;
}
impl<K: Eq + Hash> Set<K> for HashSet<K> {
    fn does_contain(&self, value: &K) -> bool {
        self.contains (value)
    }
}
impl<K: Eq + Ord> Set<K> for BTreeSet<K> {
    fn does_contain(&self, value: &K) -> bool {
        self.contains (value)
    }
}

fn topological_sort<K, S: Set<K>, M: Index<K, Output=S>> (depmp: &M) -> Option<Vec<K>> {
    unimplemented!()
}
使用std::collections::*;
使用std::hash::hash;
使用std::ops::Index;
特征集{
fn是否包含(&self,value:&K)->bool;
}
哈希集的impl集{
fn_是否包含(&self,value:&K)->bool{
self.contains(值)
}
}
B树集的impl集{
fn_是否包含(&self,value:&K)->bool{
self.contains(值)
}
}
fn拓扑排序(depmp:&M)->选项{
未执行!()
}

它用于在地图类型上进行抽象,并使用自定义的
Set
trait在Set类型上进行抽象。

此功能也称为高级类型,Rust还没有此功能。此外,在锈蚀中,只能访问由性状界限提供的泛型类型参数的方法和关联类型,而不是C++。Rust标准库中没有描述通用地图的特征,因此,您必须定义自己的trait,并使用关联类型作为键类型。请看一下Rust中的迭代器。您可能可以使用类似
M:Index
的东西来抽象映射类型,但我认为抽象集合类型没有等价物。尽管您可能可以编写自己的trait来进行抽象
HashSet
BTreeSet
..@SvenMarnach,所以我需要编写
trait-GenericSet
trait-GenericMap
,然后
impl-GenericSet for HashSet
,等等。这很有意义,谢谢。