Как определить границы черт для связанного типа? - PullRequest
0 голосов
/ 18 января 2019

Я хочу написать функцию, которая принимает Iterator типа с признаком ToString.

Что я имею в виду:

fn parse<T: Iterator /* ?T::Item : ToString? */>(mut args: T) -> Result<String, String> {
    match args.next() {
        Some(x) => x.to_string(),
        None => String::from("Missing parameter"),
    }
}

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Вы можете использовать синтаксис Item = :

fn parse<I: ToString, T: Iterator<Item = I>>(mut args: T) -> Result<String, String>

Это позволяет еще больше упростить это с помощью синтаксиса impl:

fn parse<T: Iterator<Item = impl ToString>>(mut args: T) -> Result<String, String>

и наконец:

fn parse(mut args: impl Iterator<Item = impl ToString>) -> Result<String, String>

Я бы посчитал эту альтернативу более читабельной.

0 голосов
/ 18 января 2019

Да, вы можете сделать это с помощью предложения where:

fn parse<T: Iterator>(mut args: T) -> Result<String, String>
where 
    <T as Iterator>::Item: ToString,
{
   // ....
}

Или, поскольку здесь однозначно подразумевается Item, граница может быть просто:

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