Как объявить тип, который является смешанной коллекцией значений разных типов, которые могут быть преобразованы в другие типы с помощью trait Into?

Как я могу получить `Vec<&dyn Into<JsValue>>`?
  • 10 сентября 2023 г. 16:57
Ответы на вопрос 2
Для объявления типа, который является коллекцией значений разных типов, можно использовать параметры типа (generics) и ограничения типа (type bounds). В данном случае, можно объявить тип с помощью параметра типа `T`, который ограничен trait-ом `Into<JsValue>`.

Вот пример объявления такого типа:

```rust
use wasm_bindgen::JsValue;

fn main() {
    struct MyCollection<T: Into<JsValue>> {
        values: Vec<T>,
    }

    let collection: MyCollection<&dyn Into<JsValue>> = MyCollection {
        values: vec![1, "hello", JsValue::from(3.14)],
    };
}
```

В этом примере, `MyCollection<T>` является структурой, которая имеет поле `values` типа `Vec<T>`, где `T` ограничен trait-ом `Into<JsValue>`. Затем, мы создаем экземпляр `MyCollection<&dyn Into<JsValue>>` и инициализируем его значениями разных типов, которые могут быть сконвертированы в `JsValue`.

Обратите внимание на использование `&dyn Into<JsValue>` вместо `T` в объявлении переменной `collection`. Это связано с тем, что Rust не позволяет напрямую использовать trait-ы в качестве типов в параметрах типа, поэтому мы можем использовать указатель на trait (`&dyn Into<JsValue>`) вместо него.

Надеюсь, это ответит на ваш вопрос!
Vec>, поскольку размер T известен во время компиляции и может отличаться для разных структур.
Похожие вопросы