Задать вопрос
Trame2771
@Trame2771

Откуда взялась ассоциативная функция from?

use ::wasm_bindgen::prelude::wasm_bindgen;
use ::wasm_bindgen::prelude::JsValue;

#[wasm_bindgen(start)]
pub fn js_main() {
    let window = ::web_sys::window().expect("No window");
    let document = window.document().expect("No document");
    let canvas = document.get_element_by_id("canvas")
        .expect("No canvas"); // Тут тоже подвоха нет. get_element_by_id() возвращает Option<Element>, а не Option<&Element>
    
    ::web_sys::console::log(
        &{
            let a = ::js_sys::Array::new();
            a.set(0, JsValue::from(canvas)); // Вот это меня волнует. Почему это работает без ссылки
            a
        }
    );
}

Я сделал эквивалент trait-a из crate-а wasm-bingen и его структуры JsValue:
struct Element();
struct JsValue();

impl<'a, T> From<&'a T> for JsValue
{
    fn from(v: &'a T) -> JsValue {
        JsValue()
    }
}


fn main() {
    let element = Element();
    let js_value = JsValue::from(element); // Не работает. Работает только с &element
}

Это не работает. В wasm-bindgen::JsValue Нету impl<T> From<T> for JsValue. Я не понимаю как JsValue::from(canvas) работает без & перед canvas. Меня эти непонимания пугают. Я поэтому с C++ перешёл на Rust, потому что надеялся что всё понятно будет, что гарантировало бы, что внезапно каких-то проблем не возникнет с неопределённым временем решения. Но эти поганые макросы наносят уроны документации, и не видно какие именно есть поля и функции у JsValue. Но я и исходный код весь прошерстил, не увидел макроса похожего на генерацию имплементации такого trait-а. Боюсь что какие-то приколы у самого языка, и надо искать шире, чем From trait
  • Вопрос задан
  • 78 просмотров
Подписаться 1 Сложный Комментировать
Решения вопроса 1
vabka
@vabka Куратор тега Rust
В wasm-bindgen::JsValue Нету impl From for JsValue

Всё там есть https://docs.rs/virtual-dom-rs/latest/virtual_dom_...
impl From<Element> for JsValue
+ есть целый ряд blanket impl

Не работает. Работает только с &element

Потому что ты реализовал трейт для &element, а не для element.
Сам же в начале написал, что
Тут тоже подвоха нет. get_element_by_id() возвращает Option<Element>, а не Option<&Element>

Вот такое уже работает:
https://play.rust-lang.org/?version=stable&mode=de...

Но эти поганые макросы наносят уроны документации, и не видно какие именно есть поля и функции у JsValue.

Макросы на это влиять не должны. VS Code с rust-analyzer и intellij rust умеют показывать все impl для структуры, в том числе blanket impl и те impl которые возникли в результате вызова макроса.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы