Как вам скажет компилятор:
рассмотрите возможность добавления where std::string::String: std::convert::From<T>
bound
fn example<T>(node: Node<T>)
where
String: From<T>,
{
// ...
}
Это не будет работать для String: From<Option<Node<T>>>
, потому что такого нетреализация.
Если вы хотите отформатировать вашу структуру, вам нужно вместо этого потребовать реализацию Display
.Нет смысла конвертировать значение в String
только для его отображения:
fn example<T>(node: Node<T>)
where
T: std::fmt::Display
{
// ...
}
Опять же, это не работает в вашем большем случае, потому что ни Node<T>
, ни Option<T>
не реализуютDisplay
.
См. Также:
Возможно, вы захотите что-то вроде
fn example<T>(mut node: Node<T>)
where
T: std::fmt::Display,
{
print!("{}", node.element);
while let Some(n) = node.next {
print!(" -> {}", n.element);
node = *n;
}
}
или
fn example<T>(mut node: &Node<T>)
where
T: std::fmt::Display,
{
print!("{}", node.element);
while let Some(n) = &node.next {
print!(" -> {}", n.element);
node = &n;
}
}
Или даже реализовать Display
/ Debug
самостоятельно, используя тот же код.
Вы также должны прочитать Learning Rust со слишком большим количеством связанных списков .Вы пытаетесь создать двусвязный список, который невозможен в Safe Rust.