如何将特征绑定到 web_sys::HtmlElement::from 函数
How to put a trait bound for web_sys::HtmlElement::from function
对于类型为 web_sys::HtmlDivElement
的 e_text
和类型为 web_sys::HtmlButtonElement
的 e_button
,此函数为 on_click 回调构建闭包。编译运行正常。
let a = buildCbClosure(web_sys::HtmlElement::from(e_text));
fn buildCbClosure(mut e : web_sys::HtmlElement) -> Closure<dyn FnMut(web_sys::MouseEvent)> {
let a = Closure::wrap(Box::new(move |event: web_sys::MouseEvent| {
handleButtonClick(&event);
e.set_text_content(Some("Text - Klik"));
}) as Box<dyn FnMut(_)>);
a
}
e_button.set_onclick(Some(a.as_ref().unchecked_ref()));
下一步是将 web_sys::HtmlElement::from
泛化并移动到 buildCbClosure
函数中,但尚未在 e
上找到捕获此功能的特征绑定。尝试过类似下面的方法,这显然是错误方向的 From
特征。另一个方向就像 web_sys::HtmlElement
:
的不同子类型的一般向上转换
fn buildCbClosure<T : From<web_sys::HtmlElement>>(mut t : T) -> Closure<dyn FnMut(web_sys::MouseEvent)> {
let mut elem = web_sys::HtmlElement::from(t);
let a = Closure::wrap(Box::new(move |event: web_sys::MouseEvent| {
handleButtonClick(&event);
elem.set_text_content(Some("Text - Klik"));
}) as Box<dyn FnMut(_)>);
a
}
给出:
error[E0277]: the trait bound `web_sys::HtmlElement: std::convert::From<T>` is not satisfied
--> src/lib.rs:59:20
|
59 | let mut elem = web_sys::HtmlElement::from(t);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `std::convert::From<T>` is not implemented for `web_sys::HtmlElement`
From
特征的逆是 Into
。如果 T
.
存在 From<O>
实现,Into<T>
会自动为类型 O
实现
fn buildCbClosure(e : impl Into<web_sys::HtmlElement>) -> Closure<dyn FnMut(web_sys::MouseEvent)> {
let mut e = e.into(); // `e` is an HtmlElement.
}
现在,任何可以传递给 HtmlElement::from(t)
的 t
都可以直接传递给 buildCbClosure(t)
。
对于类型为 web_sys::HtmlDivElement
的 e_text
和类型为 web_sys::HtmlButtonElement
的 e_button
,此函数为 on_click 回调构建闭包。编译运行正常。
let a = buildCbClosure(web_sys::HtmlElement::from(e_text));
fn buildCbClosure(mut e : web_sys::HtmlElement) -> Closure<dyn FnMut(web_sys::MouseEvent)> {
let a = Closure::wrap(Box::new(move |event: web_sys::MouseEvent| {
handleButtonClick(&event);
e.set_text_content(Some("Text - Klik"));
}) as Box<dyn FnMut(_)>);
a
}
e_button.set_onclick(Some(a.as_ref().unchecked_ref()));
下一步是将 web_sys::HtmlElement::from
泛化并移动到 buildCbClosure
函数中,但尚未在 e
上找到捕获此功能的特征绑定。尝试过类似下面的方法,这显然是错误方向的 From
特征。另一个方向就像 web_sys::HtmlElement
:
fn buildCbClosure<T : From<web_sys::HtmlElement>>(mut t : T) -> Closure<dyn FnMut(web_sys::MouseEvent)> {
let mut elem = web_sys::HtmlElement::from(t);
let a = Closure::wrap(Box::new(move |event: web_sys::MouseEvent| {
handleButtonClick(&event);
elem.set_text_content(Some("Text - Klik"));
}) as Box<dyn FnMut(_)>);
a
}
给出:
error[E0277]: the trait bound `web_sys::HtmlElement: std::convert::From<T>` is not satisfied
--> src/lib.rs:59:20
|
59 | let mut elem = web_sys::HtmlElement::from(t);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `std::convert::From<T>` is not implemented for `web_sys::HtmlElement`
From
特征的逆是 Into
。如果 T
.
From<O>
实现,Into<T>
会自动为类型 O
实现
fn buildCbClosure(e : impl Into<web_sys::HtmlElement>) -> Closure<dyn FnMut(web_sys::MouseEvent)> {
let mut e = e.into(); // `e` is an HtmlElement.
}
现在,任何可以传递给 HtmlElement::from(t)
的 t
都可以直接传递给 buildCbClosure(t)
。