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