Как вернуть ссылку на вложенную структуру с помощью Rust в WebAssembly - PullRequest
0 голосов
/ 23 апреля 2020

Допустим, у меня есть 2 структуры

struct Child {
  foo: String,
}

impl Child {
  pub fn do_something(&self) {
    /* some stuff */
  }
}

#[wasm_bindgen]
pub struct Parent {
  child: Child,
}

#[wasm_bindgen]
impl Parent {
  pub fn new() -> Self {
    Self { child: Child { foo: String::new() } }
  }

  pub fn child(&self) -> &Child {
    &self.child
  }
}

Я могу получить доступ к родительской структуре из JavaScript и создать ее с помощью метода new. Проблема в том, что я не могу скомпилировать код из-за ошибки cannot return a borrowed ref with #[wasm_bindgen] в методе child().

Есть ли способ получить указатель на child и получить к нему доступ из JavaScript? Почему Rust не может вернуть заимствованную ссылку на WebAssembly? Это потому, что JavaScript может изменить его значение, а Rust не может гарантировать неизменность данных?

1 Ответ

0 голосов
/ 24 апреля 2020

В WASM Javascript похоже на код ядра. Он работает на самом высоком уровне привилегий и имеет свободный доступ ко всему пространству памяти. Некоторые упоминали, что если бы Rust возвращал ссылку на JS, он мог бы оказаться висящим указателем. Это было бы плохо, но это не проблема Руста. Как и код ядра, Javascript несет ответственность за безопасность в этом контексте. Реальная проблема заключается в том, что не было бы никакого способа гарантировать, что JS не использовал неправильную ссылку, чтобы изменить данные и вызвать повреждение памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...