string - 如何使用另一个 HashSet<String> 扩展 HashSet<String>?

标签 string rust hashset ownership

这个问题在这里已经有了答案:





How can I insert all values of one HashSet into another HashSet?

(2 个回答)


9 个月前关闭。




当我尝试扩展 HashSet<String> 时与另一个 HashSet<String> :

use std::collections::HashSet;
let mut a = HashSet::new();
a.insert("foo".to_owned());
let mut b = HashSet::new();
b.insert("bar".to_owned());
let c = a.extend(&b);
我得到:
error[E0271]: type mismatch resolving `<&HashSet<String> as IntoIterator>::Item == String`
 --> src/main.rs:7:11
  |
7 | let c = a.extend(&b);
  |           ^^^^^^ expected reference, found struct `String`
  |
  = note: expected reference `&String`
                found struct `String`
我该怎么做呢?

最佳答案

HashSet::extend()来自 Extend trait 并因此接受任何迭代器(或可迭代的),而不仅仅是一个集合。
如果您将引用传递给集合,则该引用是可迭代的,但迭代器会生成对集合元素的引用 - 在这种情况下 &String .自 HashSet::<String>::extend()期望一个生成实际字符串的迭代器,它不会编译。有两种方法可以解决此问题:

  • 通过传递集合 bextend按值:a.extend(b) ;
  • 通过从 b 创建一个显式迭代器使用 b.iter()并克隆它产生的值:a.extend(b.iter().cloned()) .

  • 在第一个变体中,b将被消耗,因此调用者不再可用,但它的字符串将在 a 中重用。 .在第二个变体中,b将保持可用,但其字符串将被复制以存储在 a .
    请注意,在任一变体中,捕获 extend() 的返回值都没有意义。 ,因为它通过副作用运行并且不返回有用的值。

    关于string - 如何使用另一个 HashSet<String> 扩展 HashSet<String>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66284094/

    相关文章:

    java - Java中检查字符串是否有小数部分 : Locale involved

    rust - Rust 的每个动态检查方面是如何实现的?

    string - 为了实现 ToSocketAddrs 特性,我如何将 String 强制转换为 &str ?

    java - 在 Java 中删除 HashSet 中的用户定义对象

    c# - 为什么不使用 HashSet<T> 类来实现 Enumerable.Distinct

    java - Java 中的 Set 不允许重复,但它接受具有相同参数的 StringBuffer 对象。为什么?

    c++ - 以科学计数法将double转换为字符串比c++中的sprintf更快

    c++ - 我的函数无法正确编译

    mongodb - GitHub 操作无法连接到 MongoDB 服务

    c - 希腊字符串的长度大于应有的长度