Is ` -> impl Any` mean, that I can return a type dynamically or?


#1

What is difference between impl Trait and impl Any?


#2

Yes you can write impl Any and that allows you to return any static type.

impl Trait is just a name for the feature that allows you to write impl ? where you can put any trait name in place of ?. You would probably never actually write impl Trait verbatim in your code, because that would mean you have a trait named “Trait” which seems weird.

The feature is documented at https://doc.rust-lang.org/edition-guide/rust-2018/trait-system/impl-trait-for-returning-complex-types-with-ease.html .


#3

And what is the drawback of impl Any?


#4

Any does not provide any functionality. You can’t call any methods on an impl Any or do practically anything else with it without first downcasting it.

use std::any::Any;

fn return_one() -> i32 {
    1
}

fn return_one_any() -> impl Any {
    1
}

fn main() {
    let a = return_one();
    let b = return_one_any();
    println!("{} + {} = {}", a, b, a + b);
}
error[E0277]: cannot add `impl std::any::Any` to `i32`
  --> src/main.rs:14:38
   |
14 |     println!("{} + {} = {}", a, b, a + b);
   |                                      ^ no implementation for `i32 + impl std::any::Any`
   |
   = help: the trait `std::ops::Add<impl std::any::Any>` is not implemented for `i32`

error[E0277]: `impl std::any::Any` doesn't implement `std::fmt::Display`
  --> src/main.rs:14:33
   |
14 |     println!("{} + {} = {}", a, b, a + b);
   |                                 ^ `impl std::any::Any` cannot be formatted with the default formatter
   |
   = help: the trait `std::fmt::Display` is not implemented for `impl std::any::Any`
   = note: in format strings you may be able to use `{:?}` (or {:#?} for pretty-print) instead
   = note: required by `std::fmt::Display::fmt`

#5

Any is one of the traits, so impl Any is an example of a feature generally referred to as impl Trait.

Any has some dynamic behavior itself, but it’s probably not what you want.

impl Trait itself is not dynamic. It behaves as if you used one specific type only. You just don’t have to write the full name of the type.

dyn Trait is dynamic.