Какая история или происхождение у ассоциативной функции "from"?

  • 9 сентября 2023 г. 17:57
Ответы на вопрос 2
Причина, по которой `JsValue::from(canvas)` работает без использования ссылки (`&`), в то время как `JsValue::from(element)` требует ссылки (`&`), связана с реализацией `From` trait в Rust и особенностями некоторых типов данных.

В Rust множество типов реализуют `From<T>` trait, который позволяет конвертировать один тип в другой. Когда мы вызываем `JsValue::from(some_value)`, Rust применяет метод `from` для типа `JsValue`, который принимает значение `some_value` типа `T` и конвертирует его в `JsValue`.

В случае `JsValue::from(canvas)`, метод `from` для `JsValue` ожидает значение типа `Into<JsValue>`. `Into` - это другой trait в Rust, который описывает конвертацию из типа `T` в другой тип. И поскольку `canvas` реализует `Into<JsValue>`, и вызов `JsValue::from(canvas)` возвращает `JsValue`.

С другой стороны, при вызове `JsValue::from(element)`, метод `from` ожидает значение типа `&T`. Тип `element` не реализует `Into<JsValue>`, но реализует `From<Element>`. Поэтому мы должны передать ссылку на `element` при вызове `JsValue::from(&element)`, чтобы соответствовать ожидаемому типу `&T`.

Таким образом, различие в использовании ссылки в этих двух случаях связано с тем, как реализованы конверсии через `From` и `Into` traits для соответствующих типов данных.
wasm-bindgen::JsValue не имеет реализации impl From для JsValue, но возможно существует blanket impl или ты что-то пропустил. Например, есть трейт FromWasmAbi. (ссылка: https://docs.rs/wasm-bindgen/0.2.63/wasm_bindgen/convert/trait.FromWasmAbi.html)

Не работает, потому что ты реализовал трейт для &element, а не для element. Как ты сказал в начале.

Здесь также нет подвоха. Метод get_element_by_id() возвращает Option, а не Option<&Element>. 

Вот код, который уже работает: (ссылка: https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=dcdf304bee9523f2d38376910a0f5657)

Однако, эти макросы затрудняют работу с документацией и не позволяют увидеть доступные поля и функции у JsValue.

Макросы не должны влиять на это. Программы разработанные на Visual Studio Code с расширением rust-analyzer и Intellij Rust позволяют просматривать все impl структуры, включая blanket impl и имплементации, созданные макросами.
Похожие вопросы