生锈的循环借来的价值并不长久

2022-10-15 13:34:51标签rustzeromqrust-tokio
提问

在retv(redis to zmq)实现中,我无法弄清楚如何解决临时值的寿命问题(从循环中从pubsub中获取的消息)。 我非常理解为什么,但我迄今为止未能生成Vec <和string >,我需要传入zmq发布者。我尝试了不同类型的克隆等。但我只是得到了与所有权和生命相关的相同或类似的错误。 问题代码: 而错误是: 这是失败的,因为sink希望进入< Message >,但显然不会立即执行转换,因此引用需要继续存在于一些未指定的时间,它们提到的值很快就被摧毁了。基本上你需要给水槽一个拥有的价值,而不是借来的价值。 您可以通过将字符串转换为消息值,然后将其转换为发布接收器,或者通过赋予它可以转换为消息的所有值来实现这一点。没有从字符串到消息的转换,但是有一个来自Vec < u8 >的转换,您可以将一个字符串转换为Vec < u8 >,没有任何复制使用字符串:in _bytes()方法。

async fn ps_rebroadcaster() -> Result<(), ApiError>{
    let mut inproc_publisher: async_zmq::Publish<std::vec::IntoIter<&std::string::String>, &std::string::String>  = async_zmq::publish("ipc://pricing")?.bind()?;
    let con_str = &APP_CONFIG.REDIS_URL;
    let conn = create_client(con_str.to_string())
        .await
        .expect("Can't connect to redis");
    let mut pubsub = conn.get_async_connection().await?.into_pubsub();
    match pubsub.psubscribe("T1050_*").await {
        Ok(_) => {}
        Err(_) => {}
    };
    let mut msg_stream = pubsub.into_on_message();
    loop {
        let result = msg_stream.next().await;
        match result {
            Some(message) => {
                let channel_name = message.get_channel_name().to_string();
                let payload_value: redis::Value = message.get_payload().expect("Can't get payload of message");
                let payload_string: String = FromRedisValue::from_redis_value(&payload_value).expect("Can't convert from Redis value");
                let item: Vec<&String> = vec![&channel_name , &payload_string  ];
                // problem here  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
                inproc_publisher.send(item.into()).await?;
            }
            None => {
                println!("None received");
                continue;
            }
        }
    }
}

error[E0597]: `channel_name` does not live long enough
   --> src/server.rs:248:47
    |
248 |                 let item: Vec<&String> = vec![&channel_name , &payload_string  ];
    |                                               ^^^^^^^^^^^^^ borrowed value does not live long enough
249 |                 
250 |                 inproc_publisher.send(item.into()).await?;
    |                 ---------------------------------- borrow later used here
251 |             }
    |             - `channel_name` dropped here while still borrowed
error[E0597]: `payload_string` does not live long enough
   --> src/server.rs:248:63
    |
248 |                 let item: Vec<&String> = vec![&channel_name , &payload_string  ];
    |                                                               ^^^^^^^^^^^^^^^ borrowed value does not live long enough
249 |                 
250 |                 inproc_publisher.send(item.into()).await?;
    |                 ---------------------------------- borrow later used here
251 |             }
    |             - `payload_string` dropped here while still borrowed
回答

▼版权说明

相关文章也很精彩
推荐内容
更多标签
相关热门
全站排行
随便看看

错说cuoshuo.com——程序员的报错记录

部分内容根据CC版权协议转载,如果您希望取消转载请发送邮件到cuoshuo8@163.com

辽ICP备19011660号-5