Как привести общий T к String? - PullRequest
0 голосов
/ 01 апреля 2019

Я пытаюсь напечатать пользовательский тип:

struct Node<T> {
    prev: Option<Box<Node<T>>>,
    element: T,
    next: Option<Box<Node<T>>>,
}

Теперь проблема:

print!(
    "{0} -> {1}",
    String::from(node.element),
    String::from(node.next)
);
error[E0277]: the trait bound `std::string::String: std::convert::From<T>` is not satisfied
  --> src/lib.rs:10:9
   |
10 |         String::from(node.element),
   |         ^^^^^^^^^^^^ the trait `std::convert::From<T>` is not implemented for `std::string::String`
   |
   = help: consider adding a `where std::string::String: std::convert::From<T>` bound
   = note: required by `std::convert::From::from`

error[E0277]: the trait bound `std::string::String: std::convert::From<std::option::Option<std::boxed::Box<Node<T>>>>` is not satisfied
  --> src/lib.rs:11:9
   |
11 |         String::from(node.next)
   |         ^^^^^^^^^^^^ the trait `std::convert::From<std::option::Option<std::boxed::Box<Node<T>>>>` is not implemented for `std::string::String`
   |
   = help: the following implementations were found:
             <std::string::String as std::convert::From<&'a str>>
             <std::string::String as std::convert::From<std::borrow::Cow<'a, str>>>
             <std::string::String as std::convert::From<std::boxed::Box<str>>>
   = note: required by `std::convert::From::from`

Как привести node.element к String иOption<Box<Node<T>>> до String?

1 Ответ

3 голосов
/ 01 апреля 2019

Как вам скажет компилятор:

рассмотрите возможность добавления 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.

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