String Rust rustc::middle::graph::带字符串节点索引的图

String Rust rustc::middle::graph::带字符串节点索引的图,string,rust,lifetime,String,Rust,Lifetime,我不熟悉使用0.10,并通过实现类似struct的东西来探索它的用法,但使用字符串作为节点索引并将节点存储在HashMap中 假设是非静态键,对于字符串的所有权,什么是合理有效的策略?HashMap是否需要拥有自己的密钥?每个节点索引是否需要拥有自己的str?节点是否可能拥有定义其索引的字符串,并让其他所有内容借用该字符串?更一般地说,如何在多个数据结构之间共享一个不可变但非静态的字符串?如果答案是视情况而定,那么相关问题是什么 如果有可能在一个地方拥有这根绳子的所有权,然后在其他地方借用它,那

我不熟悉使用0.10,并通过实现类似struct的东西来探索它的用法,但使用字符串作为节点索引并将节点存储在HashMap中

假设是非静态键,对于字符串的所有权,什么是合理有效的策略?HashMap是否需要拥有自己的密钥?每个节点索引是否需要拥有自己的str?节点是否可能拥有定义其索引的字符串,并让其他所有内容借用该字符串?更一般地说,如何在多个数据结构之间共享一个不可变但非静态的字符串?如果答案是视情况而定,那么相关问题是什么

如果有可能在一个地方拥有这根绳子的所有权,然后在其他地方借用它,那么这是如何实现的呢?例如,如果修改节点结构以将节点索引存储为字符串,HashMap和NodeIndex将如何使用它的借用版本

节点是否可能拥有定义其索引的字符串,并让其他所有内容借用该字符串

[……]

如果有可能在一个地方拥有这根绳子的所有权,然后在其他地方借用它,那么这是如何实现的呢?例如,如果修改节点结构以将节点索引存储为字符串,HashMap和NodeIndex将如何使用它的借用版本

不太可能:编译器不可能验证自引用是否无效,也就是说,许多内部借用情况(包括这一情况)最终都会允许类似的代码

结构Foo } 设mut-foo=foo{…}; foo.things.push~x; foo.things.push~y; //事情是[~x,~y] //试着借用~y将y放入借词中 foo.bolows.pushfoo.things.get1.as\u slice; // ... 时间/SLoC流逝。。。 //我们将借用的切片指向已释放的内存 //通过弹出/取消分配~y foo.things.pop; 编译器很难判断任意修改不会像.pop调用那样导致内部指针无效。基本上,将对象拥有的数据的自引用放入对象本身将不得不冻结该对象,因此不会发生进一步的修改,包括移出结构,例如返回它

Tl;dr:不能让图形的一部分存储~str,另一部分将&str切片存储到这些~str中

也就是说,如果您使用一些不安全的代码,只允许对图形进行扩展,即从不删除节点,即在整个图形被销毁之前不允许释放~str,那么某些版本的代码实际上可以工作

更一般地说,如何在多个数据结构之间共享一个不可变但非静态的字符串

您可以使用Rc,每个数据结构都存储自己的指针。差不多

结构图{ 节点:HashMap } 结构节点{ 姓名:Rc,, 数据:T, 输出_边:Vec } 另一种方法是使用双向映射,将字符串与简单类型的内部索引连接起来,如

结构图{ 索引:BiMap, 节点:HashMap } [derivingHash,Eq,TotalEq] 结构索引{x:uint} 结构节点{ 名称:索引,, 数据:T, 输出_边:Vec }
不幸的是,这是假设性的:Rust的stdlib还没有这样的BiMap类型….

BTW,或者是一个更有用的链接,您刚才展示的是图形模块的声明。第一个链接正是我想要使用的链接。我已经相应地更新了描述。谢谢谢谢你的帮助和明确的答案!这有助于澄清问题。我会和Rc一起玩;我确实希望能够删除节点和边,听起来这是最直观的方法。