#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());
}