Как реализовать черту с помощью универсального метода? - PullRequest
0 голосов
/ 31 октября 2018

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

trait Trait {
    fn method<T>(&self) -> T;
}

struct Struct;

impl Trait for Struct {
    fn method(&self) -> u8 {
        return 16u8;
    }
}

Я получаю:

error[E0049]: method `method` has 0 type parameters but its trait declaration has 1 type parameter
 --> src/lib.rs:8:5
  |
2 |     fn method<T>(&self) -> T;
  |     ------------------------- expected 1 type parameter
...
8 |     fn method(&self) -> u8 {
  |     ^^^^^^^^^^^^^^^^^^^^^^ found 0 type parameters

Как правильно написать блок impl?

1 Ответ

0 голосов
/ 31 октября 2018

Параметры типа в функциях и методах: универсальный . Это означает, что для всех реализаций признака Trait::method<T> должен быть реализован для любого T с точно такими же ограничениями, которые указаны в признаке (в этом случае ограничение на T является только неявным Sized).

Указанное вами сообщение об ошибке компилятора предполагает, что он все еще ожидает тип параметра T. Вместо этого ваша реализация Struct предполагает, что T = u8, что неверно. Параметр типа определяется вызывающим методом, а не разработчиком, поэтому T не всегда может быть u8.

Если вы хотите, чтобы разработчик выбрал конкретный тип, он должен быть материализован в связанном типе.

trait Trait {
    type Output;

    fn method(&self) -> Self::Output;
}

struct Struct;

impl Trait for Struct {
    type Output = u8;

    fn method(&self) -> u8 {
        16
    }
}

Прочтите также этот раздел Язык программирования Rust : Указание типов заполнителей в определениях признаков со связанными типами .

Смотри также:

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