Необязательный аргумент функции, который указывается в качестве признака вместо конкретного типа
Я смотрю 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
,