Как мне получить доступ к навигатору или другим веб-ресурсам в web_sys?

#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 ресурс. Вам необходимо:

  1. Убедитесь, что указанный ресурс активен, включив соответствующую функцию загрузки:
 web_sys = { version = "0.3", features = ["Navigator, Window"] }
  
  1. Извлеките глобальное окно через web_sys::window , проверив, доступно ли оно.

  2. Вы можете, наконец, получить требуемый ресурс с помощью одного из доступных методов получения ( window.navigator() ).

Код:

 let window = web_sys::window().expect("Missing Window");

let navigator = window.navigator();

let do_not_track = navigator.do_not_track();
  

Смотрите также:

Комментарии:

1. Я понятия не имею, как вы это нашли, документ не очень дружелюбный

2. Документация является скорее справочником, чем руководством пользователя. Я полагаю, вас заинтересует ссылка на руководство wasm-bindgen, поэтому я оставил ссылку в ответе.