Необязательный аргумент функции, который указывается в качестве признака вместо конкретного типа

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

Я пишу обёртку от ржавчины вокруг библиотеки ENet ( http://enet.bespin.org/). Моя цель - сохранить API-интерфейс ржавчины как можно более похожим на API-интерфейс C, за исключением функций рефакторинга, которые используют указатели дескрипторов стиля C в функциях-членах объектов структуры. Я хочу, чтобы API был похожим, так что официальная документация C будет одинаково хорошо применяться к оболочке для ржавчины.

ENet предоставляет одну функцию для создания хоста клиента или хоста сервера. При создании сервера вы передаете указатель на структуру IP-адреса функции. При создании клиента вы передаете NULL.

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

Это сокращенный пример того, что я пытаюсь сделать:

use std::io::net::ip::ToSocketAddr;

fn create_host<A: ToSocketAddr>(addr: Option<A>) {
    match addr {
        Some(a) => println!("Address is {}. Return a server host object.",a.to_socket_addr()),
        None    => println!("no address... Return a client.")
    };
}


fn main() {
    create_host(Some("localhost:12345"));
    create_host(None);
}

Первый звонок create_host() работает как шарм. Однако второй вызов не будет компилироваться.

Руст возвращается

error: unable to infer enough type information about `_`; type annotations required

Я предполагаю, что ошибка происходит потому, что None не предоставляет никакого разрешения для общего A, Я попробовал следующее, но это тоже не работает, потому что ToSocketAddr не реализует черту core::kinds::Sized,

fn create_host(addr: Option<ToSocketAddr>) {
    ...
}

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

1 ответ

Решение
fn main() {
    create_host(Some("localhost:12345"));
    create_host(None::<&str>);
}

Я выбрал &str здесь тот же тип, что и при первом вызове, чтобы компилятор не генерировал другую мономорфизированную версию универсальной функции. Вы можете выбрать любой тип, который реализует ToSocketAddr,

Другие вопросы по тегам