#rust #webassembly
#Ржавчина #webassembly
Вопрос:
Недавно я прочитал документацию по Rust и теперь решил поиграть с API web_sys. Я пытаюсь использовать средство Navigator::do_not_track
получения… ну, чтобы быть более конкретным, я хотел бы напечатать возвращаемое значение. Согласно документации, это подпись получателя:
pub fn do_not_track(amp;self) -> String
Если я правильно понимаю, я должен иметь возможность использовать format!
макрос:
format!("{}", Navigator::do_not_track);
Я правильно импортировал API Navigator, без каких-либо сомнений. Ошибка:
error[E0277]: `for<'r> fn(amp;'r web_sys::features::gen_Navigator::Navigator) -> std::string::String {web_sys::features::gen_Navigator::Navigator::do_not_track}` doesn't implement `std::fmt::Display`
--> src/lib.rs:19:19
|
19 | format!("{}", Navigator::do_not_track);
| ^^^^^^^^^^^^^^^^^^^^^^^ `for<'r> fn(amp;'r web_sys::features::gen_Navigator::Navigator) -> std::string::String {web_sys::features::gen_Navigator::Navigator::do_not_track}` cannot be formatted with the default formatter
|
= help: the trait `std::fmt::Display` is not implemented for `for<'r> fn(amp;'r web_sys::features::gen_Navigator::Navigator) -> std::string::String {web_sys::features::gen_Navigator::Navigator::do_not_track}`
= note: in format strings you may be able to use `{:?}` (or {:#?} for pretty-print) instead
= note: required by `std::fmt::Display::fmt`
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
И если я попытаюсь использовать web_sys::navigator
, я получу
could not find "navigator" in "web_sys"
Как мне получить доступ к API web navigator с помощью web_sys
?
Комментарии:
1.
do_not_track
является связанной функцией. Его необходимо вызвать, чтобы получить строковое значение :Navigator::do_not_track()
.2. Хм … в этом случае другая ошибка:
expected 1 argument
3. Ах да, это метод. Глобальный навигатор должен быть
web_sys::navigator
включен, так что этоweb_sys::navigator.do_not_track()
.4. Если мы ссылаемся на весь путь, это должно быть
web_sys::Navigator::do_not_track()
, и все же, та же проблема:expected 1 argument
5. и если мы попытаемся использовать
navigator
:could not find "navigator" in "web_sys"
Ответ №1:
Обратите внимание, что Navigator::do_not_track
это метод, который означает, что Navigator
сначала необходимо получить значение типа. Одним из возможных источников путаницы было то, что не удалось найти способ его создания.
Большинство веб-ресурсов, которые вы найдете в качестве глобальных переменных в среде JavaScript с поддержкой DOM, доступны через Window
ресурс. Вам необходимо:
- Убедитесь, что указанный ресурс активен, включив соответствующую функцию загрузки:
web_sys = { version = "0.3", features = ["Navigator, Window"] }
-
Извлеките глобальное окно через
web_sys::window
, проверив, доступно ли оно. -
Вы можете, наконец, получить требуемый ресурс с помощью одного из доступных методов получения (
window.navigator()
).
Код:
let window = web_sys::window().expect("Missing Window");
let navigator = window.navigator();
let do_not_track = navigator.do_not_track();
Смотрите также:
wasm-bindgen
Руководство, которое также включает в себя руководство по использованиюweb-sys
.
Комментарии:
1. Я понятия не имею, как вы это нашли, документ не очень дружелюбный
2. Документация является скорее справочником, чем руководством пользователя. Я полагаю, вас заинтересует ссылка на руководство wasm-bindgen, поэтому я оставил ссылку в ответе.