Приведение к нестандартному типу: `std :: io :: Stdout` как ошибка` std :: io :: Write` - PullRequest
0 голосов
/ 01 июня 2018

Я пытаюсь привести Stdout к Write:

use std::io::{self, Write};

pub struct A<Output: Write> {
    output: Output,
}

impl<Output: Write> A<Output> {
    pub fn new() -> A<Output> {
        A {
            output: io::stdout() as Write,
        }
    }
}

Компилятор жалуется:

error[E0620]: cast to unsized type: `std::io::Stdout` as `std::io::Write`
  --> src/main.rs:10:21
   |
10 |             output: io::stdout() as Write,
   |                     ^^^^^^^^^^^^^^^^^^^^^
   |
help: consider using a box or reference as appropriate
  --> src/main.rs:10:21
   |
10 |             output: io::stdout() as Write,
   |                     ^^^^^^^^^^^^

Я хочу привести это и попытался сделать то, чтокомпилятор предложил, но затем он говорит, что ключевое слово as может использоваться только для примитивов, и что я должен реализовать черту From.

Как я могу разыграть Stdout как черту Write?

1 Ответ

0 голосов
/ 01 июня 2018

приведение Stdout к Write

Это не имеет смысла, поскольку Write не является типом, который вы разыгрываете к .Write это черта.Существуют объекты-черты , которые являются типами, например Box<Write> или &Write.Перечитайте главу Объекты-черты Язык программирования Rust , чтобы освежить вашу память на эту тему.Rust 1.27 собирается улучшить синтаксис здесь, чтобы сделать его более очевидным как Box<dyn Write> / &dyn Write.

Вы можете использовать Box::new(io::stdout()) as Box<Write>, но вы быстро столкнетесь с ошибкой "Ожидаемый тип параметра" в конструкторе общей структуры .

impl A<Box<Write>> {
    pub fn new() -> Self {
        A {
            output: Box::new(io::stdout()) as Box<Write>,
        }
    }
}

См.также:

...