У меня есть признак для чтения и записи потоков (например, TcpStream
):Черта реализации с определенной структурой в качестве параметра
pub trait MyTraitPool<T: Read + Write> {
fn acquire(&self, &String) -> T;
fn free(&self, T);
}
Я хочу осуществить эту черту с TcpStream
как T
, так что я хотел бы написать
struct MyPool;
impl<T> MyTraitPool<T> for MyPool
where T: Read + Write {
fn acquire(&self, addr: &String) -> T {
TcpStream::connect(addr.as_str()).unwrap()
}
fn free(&self, con: T) {
con.shutdown(Shutdown::Both);
}
}
Я получаю ошибку «ожидаемый тип параметра, найденный struct std::net::TcpStream
» в методе acquire
. Что касается метода free
, я знаю, что shutdown
является TcpStream
-специфичным, но я хотел бы иметь конкретную реализацию для TcpStream
s в этой точке и, следовательно, иметь возможность называть TcpStream
-специфическими методами. Итак, как я могу это сделать?
В качестве побочного примечания: реализация является лишь примером того, что я хотел бы сделать, а не как работает код позже!
У меня возникают разные проблемы: «ожидаемый тип параметра, найденный enum' std :: result :: Result' »(вам не хватает' unwrap' в коде выше?) И «no method с именем' shutdown' найдено для типа 'T' в текущей области действия (при условии, что вы используете только' std :: net :: {TcpStream, Shutdown} и 'std :: io :: {Read, Write}'). – ljedrz
@ljedrz реализация выше - это всего лишь образец, поэтому я не проверял типы возвращаемых данных или управление ошибками и т. Д. (Я хотел сохранить цель простой и удобочитаемой). Вторая проблема фактически упоминается в тексте выше;) –
Ах да, я не читал достаточно внимательно :). Тем не менее, всегда рекомендуется указывать код, который воспроизводит точный вопрос, который у вас возникает при компиляции ([MCVE] (http://stackoverflow.com/help/mcve)). Это значительно облегчает поиск подходящего решения к вашему конкретному случаю. – ljedrz