如何将泛型T发送到另一个线程?

阿努纳基

如何发送仿制药T

我尝试将泛型发送T到另一个线程,但是我得到了:

error[E0308]: mismatched types
  --> src/main.rs:23:22
   |
23 |             t1.merge(Element(vec![3]));
   |                      ^^^^^^^^^^^^^^^^ expected associated type, found struct `Element`
   |
   = note: expected associated type `<T as Join>::Item`
                       found struct `Element`
   = help: consider constraining the associated type `<T as Join>::Item` to `Element`

完整代码:

trait Join {
    type Item;
    fn merge(&mut self, other: Self::Item);
}

#[derive(Debug, Default)]
struct Element(Vec<u8>);

impl Join for Element {
    type Item = Element;
    fn merge(&mut self, mut other: Self::Item) {
        self.0.append(&mut other.0);
    }
}

fn work<T>()
where
    T: Default + Join + Send + Sync + 'static,
{
    let (sender, receiver) = std::sync::mpsc::channel::<(T)>();
    std::thread::spawn(move || {
        while let (mut t1) = receiver.recv().unwrap() {
            t1.merge(Element(vec![3]));
        }
    });

    loop {
        let mut t1 = T::default();
        sender.send(t1);
        std::thread::sleep(std::time::Duration::from_secs(5));
    }
}

fn main() {
    // works!
    let mut e = Element(vec![1]);
    e.merge(Element(vec![2]));

    // bad!
    work::<Element>();
}

游乐场链接

椒盐脆饼

使用泛型时,让调用者确定泛型函数必须使用哪些类型。

您的示例中的这一行t1.merge(Element(vec![3]));是无效的,因为它假定,T = Element但调用方可以从许多可能的类型中进行选择TT != Element这就是编译器抱怨的原因。

为了使您的函数完全通用,您必须执行一些操作,例如在函数签名中添加一个Default绑定<T as Join>::Item,然后将有问题的行更改为t1.merge(<T as Join>::Item::default());

更新了工作评论示例:

use std::fmt::Debug;

trait Join {
    type Item;
    fn merge(&mut self, other: Self::Item);
}

#[derive(Debug)]
struct Element(Vec<u8>);

// updated Default impl so we can observe merges
impl Default for Element {
    fn default() -> Self {
        Element(vec![1])
    }
}

impl Join for Element {
    type Item = Element;
    fn merge(&mut self, mut other: Self::Item) {
        self.0.append(&mut other.0);
    }
}

fn work<T>() -> Result<(), Box<dyn std::error::Error>>
where
    T: Default + Join + Send + Sync + Debug + 'static,
    <T as Join>::Item: Default, // added Default bound here
{
    let (sender, receiver) = std::sync::mpsc::channel::<T>();
    std::thread::spawn(move || {
        while let Ok(mut t1) = receiver.recv() {
            // changed this to use Default impl
            t1.merge(<T as Join>::Item::default());

            // prints "Element([1, 1])" three times
            println!("{:?}", t1);
        }
    });

    let mut iterations = 3;
    loop {
        let t1 = T::default();
        sender.send(t1)?;
        std::thread::sleep(std::time::Duration::from_millis(100));
        iterations -= 1;
        if iterations == 0 {
            break;
        }
    }

    Ok(())
}

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // works!
    let mut e = Element(vec![1]);
    e.merge(Element(vec![2]));

    // now also works!
    work::<Element>()?;

    Ok(())
}

操场

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何将.bat文件命令发送到另一个IP地址?

来自分类Dev

如何将消息发送到另一个场景

来自分类Dev

如何将数据发送到另一个Android设备

来自分类Dev

如何将UIPickerView选定的行发送到另一个ViewController

来自分类Dev

如何将数据从表单发送到另一个页面?

来自分类Dev

如何将消耗的API响应发送到另一个组件?

来自分类Dev

如何将Flask中的数据发送到另一个页面?

来自分类Dev

如何将String [] imageUrl发送到另一个活动

来自分类Dev

Javascript:如何将值从列表发送到另一个

来自分类Dev

Android如何将Bundle发送到另一个Activity?

来自分类Dev

Android_如何将Bundle发送到另一个活动?

来自分类Dev

如何将数据发送到另一个基因剔除模型?

来自分类Dev

如何将数据发送到另一个程序并获得答案?

来自分类Dev

如何将表单中的列表发送到另一个表单

来自分类Dev

如何将html数据发送到另一个php页面

来自分类Dev

Android将数据从主UI线程发送到另一个线程

来自分类Dev

如何将字符串从一个活动发送到另一个活动?

来自分类Dev

如何将数据从一个片段发送到另一个片段?

来自分类Dev

如何将数据从一个ejs文件发送到另一个

来自分类Dev

如何将参数从一个函数发送到另一个函数

来自分类Dev

如何将一个活动的类对象类型的ArrayList发送到另一个活动?

来自分类Dev

如何将一个回调方法发送到另一个回调方法

来自分类Dev

如何将一个灰色日志收到的日志发送到另一个灰色日志?

来自分类Dev

如何将一个 viewController 中的图像数据发送到另一个 viewController?

来自分类Dev

如何将数组从一个活动(意图)发送到另一个?

来自分类Dev

当单击网格视图时,如何将arralist(position)发送到另一个活动

来自分类Dev

如何将流量从mitmproxy发送到另一个代理服务器

来自分类Dev

如何将数据从锚标记内的动态php表发送到另一个页面

来自分类Dev

如何将HTTP请求从我的FastAPI应用发送到另一个站点?

Related 相关文章

  1. 1

    如何将.bat文件命令发送到另一个IP地址?

  2. 2

    如何将消息发送到另一个场景

  3. 3

    如何将数据发送到另一个Android设备

  4. 4

    如何将UIPickerView选定的行发送到另一个ViewController

  5. 5

    如何将数据从表单发送到另一个页面?

  6. 6

    如何将消耗的API响应发送到另一个组件?

  7. 7

    如何将Flask中的数据发送到另一个页面?

  8. 8

    如何将String [] imageUrl发送到另一个活动

  9. 9

    Javascript:如何将值从列表发送到另一个

  10. 10

    Android如何将Bundle发送到另一个Activity?

  11. 11

    Android_如何将Bundle发送到另一个活动?

  12. 12

    如何将数据发送到另一个基因剔除模型?

  13. 13

    如何将数据发送到另一个程序并获得答案?

  14. 14

    如何将表单中的列表发送到另一个表单

  15. 15

    如何将html数据发送到另一个php页面

  16. 16

    Android将数据从主UI线程发送到另一个线程

  17. 17

    如何将字符串从一个活动发送到另一个活动?

  18. 18

    如何将数据从一个片段发送到另一个片段?

  19. 19

    如何将数据从一个ejs文件发送到另一个

  20. 20

    如何将参数从一个函数发送到另一个函数

  21. 21

    如何将一个活动的类对象类型的ArrayList发送到另一个活动?

  22. 22

    如何将一个回调方法发送到另一个回调方法

  23. 23

    如何将一个灰色日志收到的日志发送到另一个灰色日志?

  24. 24

    如何将一个 viewController 中的图像数据发送到另一个 viewController?

  25. 25

    如何将数组从一个活动(意图)发送到另一个?

  26. 26

    当单击网格视图时,如何将arralist(position)发送到另一个活动

  27. 27

    如何将流量从mitmproxy发送到另一个代理服务器

  28. 28

    如何将数据从锚标记内的动态php表发送到另一个页面

  29. 29

    如何将HTTP请求从我的FastAPI应用发送到另一个站点?

热门标签

归档