Как преобразовать двоичное значение в команду Redis?

#redis #rust

#redis #Ржавчина

Вопрос:

Я хочу вызвать функцию Redis с двоичным значением [u8] использования redis-rs ящика, используя следующий код:

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

Однако это приводит к этой ошибке data , когда Vec<u8> :

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

И эта ошибка data , когда [u8] :

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

При просмотре документации для ToRedisArgs , должна быть одна реализация для Vec<T> .

Комментарии:

1. Существует реализация либо amp;[u8] или Vec<u8> , но вы, очевидно, пытались использовать [u8] и amp;Vec<u8> , поэтому вам нужно разыменовывать или ссылаться соответствующим образом.

2. Вы также можете вызвать принудительное удаление, явно указав тип аргумента, как amp;[u8] при передаче в amp;Vec<u8> .

3. Спасибо и данные [..] сработали.

Ответ №1:

Вот воспроизводимый пример вашей проблемы:

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

Его компиляция приводит к этой ошибке:

 error[E0277]: the trait bound `amp;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 `amp;std::vec::Vec<u8>`
  |
  = help: the following implementations were found:
            <std::vec::Vec<T> as redis::ToRedisArgs>
  

Как указано в сообщении об ошибке, ToRedisArgs реализовано для Vec<T> , но нет amp;Vec<T> . Чтобы обойти это, вы можете клонировать data , чтобы получить Vec<u8> :

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

Или вы можете извлечь фрагмент из вектора, потому ToRedisArgs что это реализовано для фрагментов:

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