Может ли неуниверсальная структура реализовать обобщенную функцию в ржавчине? - PullRequest
1 голос
/ 04 июля 2019

Может ли неуниверсальная структура реализовать универсальную функцию в rust, которая работает следующим образом:


struct S;

impl <T> S {
    fn do_something(value : T) {
        //do something
    }
}

fn main() {
    let a = /*a value*/;
    S::do_something(a);
}

Если нет, при условии, что S реализует универсальную черту Tt:


struct S;

impl <T> Tt<T> for S {
    fn a_func(value : T) {
        //do something
    }
}

impl <T> S {
    fn do_something(value : T) {
        //do something
    }
}

fn main() {
    let a = /*a value*/;
    S::do_something(a);
}

IsЕсть ли способ сделать это работает?

1 Ответ

1 голос
/ 04 июля 2019

Вы можете объявить переменную типа для блока impl, только если она используется в самом типе.

Однако вы можете также вводить новые переменные типа для отдельных методов:

impl S {
    fn do_something<T>(value: T) {
        //do something
    }
}

Это особенно характерно для аргументов, которые являются замыканиями, поскольку каждое замыкание имеет свой тип, поэтому вам необходимо иметь возможность каждый раз вызывать метод с другим замыканием. Например, Iterator::map определяется следующим образом:

fn map<B, F>(self, f: F) -> Map<Self, F>
where
    F: FnMut(Self::Item) -> B, 

Если бы F был объявлен для типа вместо метода, вам пришлось бы использовать одно и то же закрытие каждый раз, когда вы вызываете map - не очень полезно.

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