Невозможно передать Vec <u8> в брандмауэр - PullRequest
0 голосов
/ 03 сентября 2018

У меня есть функция со следующей подписью:

fn f(input: &mut Read, output: &mut Write)

И я пытаюсь передать Vec<u8> s как на входе, так и на выходе:

let mut in: Vec<u8> = Vec::new();
let mut out: Vec<u8> = Vec::new();
f(&mut in[..], &mut out);

Компилятор вроде бы нормально работает с out, но я получаю сообщения об ошибках in:

error[E0277]: the trait bound `[u8]: std::io::Read` is not satisfied
--> src/crypto.rs:109:25
    |
109 |     f(&mut in[..], &mut out);     
            ^^^^^^^^^^^ the trait `std::io::Read` is not implemented for `[u8]`
    |
    = help: the following implementations were found:
              <&'a [u8] as std::io::Read>
    = note: required for the cast to the object type `std::io::Read`

error[E0277]: the trait bound `[u8]: std::marker::Sized` is not satisfied
--> src/crypto.rs:109:25
    |
109 |     f(&mut in[..], &mut out);
    |       ^^^^^^^^^^^ `[u8]` does not have a constant size known at compile-time
    |
    = help: the trait `std::marker::Sized` is not implemented for `[u8]`
    = note: required for the cast to the object type `std::io::Read`

Как правильно передать Vec в такой интерфейс?

1 Ответ

0 голосов
/ 03 сентября 2018

Ваш пример довольно легко решаем, просто заимствуйте кусочек!

use std::io::{copy, Read, Write};

fn f(input: &mut Read, output: &mut Write) {
    copy(input, output).unwrap();
}

fn main() {
    let i = vec![0u8, 1, 2, 3];
    let mut o = Vec::new();
    f(&mut &i[..], &mut o);
    println!("{:?} {:?}", i, o);
}

Хотя я не знаю, почему вы делаете i[..], потому что чтение не меняет читателя в этом конкретном случае (обратите внимание, что оно может изменить читателя, потому что оно требует изменяемой ссылки, который может (например, в сокетах) потреблять байты, которые он читает).

Вы также можете просто написать

f(&mut i.as_slice(), &mut o);

если вы не обязаны клонировать vec.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...