如何将二进制值转换为redis命令?

uinbv5nw  于 2021-06-09  发布在  Redis
关注(0)|答案(1)|浏览(444)

我想调用一个二进制值为的redis函数 [u8] 使用 redis-rs 使用以下代码的板条箱:

let _ : () = redis::cmd("...").arg("...").arg(data).query(&mut con)?;

但是,当 dataVec<u8> :

the trait `redis::ToRedisArgs` is not implemented for `&std::vec::Vec<u8>`

这个错误发生在 data[u8] :

the trait `redis::ToRedisArgs` is not implemented for `[u8]`

在查看文档时 ToRedisArgs ,应该有一个 Vec<T> 不过。

byqmnocz

byqmnocz1#

下面是一个可重现的问题示例:

fn main() {
    let data: &std::vec::Vec<u8> = &Vec::new();
    let _ = redis::cmd("...").arg(data);
}

编译它会导致以下错误:

error[E0277]: the trait bound `&std::vec::Vec<u8>: redis::ToRedisArgs` is not satisfied
 --> src/main.rs:3:33
  |
3 |   let _ = redis::cmd("...").arg(data);
  |                                 ^^^^ the trait `redis::ToRedisArgs` is not implemented for `&std::vec::Vec<u8>`
  |
  = help: the following implementations were found:
            <std::vec::Vec<T> as redis::ToRedisArgs>

如错误消息所述, ToRedisArgs 为实现 Vec<T> ,但不是 &Vec<T> . 要绕过这个,你可以克隆 data 得到一个 Vec<u8> :

fn main() {
    let data: &std::vec::Vec<u8> = &Vec::new();
    let _ = redis::cmd("...").arg(data.clone());
}

或者,你可以从向量中提取一个切片,因为 ToRedisArgs 为切片实现:

fn main() {
    let data: &std::vec::Vec<u8> = &Vec::new();
    let _ = redis::cmd("...").arg(data.as_slice());
}

相关问题