- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试编译一些 Rust 代码,但我不断收到有关类型和生命周期的错误。谁能解释我做错了什么?
我在编译时遇到错误:关联类型绑定(bind)必须在泛型参数之后声明
。我认为,我已经尝试了所有参数组合,但它们似乎都不起作用。
这是我的代码的简化版本。
/*! test of lifetimes for compile */
extern crate web_view;
use web_view::*;
struct UserData {}
type TestResult = WVResult<i64>;
type TestView = WebView<UserData>;
type TestBuilder<'a> = WebViewBuilder< UserData: 'a,'a,
FnMut(&mut TestView, &str) -> TestResult, String>; // compile error
fn main() {
let mut p = UserData {};
let wvb: TestBuilder = WebViewBuilder::new();
let mut webview: TestView = wvb
.title("Progress")
.content("hello")
.size(640, 960)
.resizable(true)
.debug(false)
.user_data(p)
.invoke_handler(handler)
.build()
.unwrap();
let _res = webview.run().unwrap();
}
fn handler(webview: &mut TestView, arg: &str) -> TestResult {
Ok(1)
}
这应该是一条评论,但它太长了,无法放入评论中。我使用了@zizka 的答案,但恢复了我原来版本的 TestResult。现在我收到“找不到函数或关联项”和“找不到类型的名为 title
的方法”的错误
use web_view::*;
struct UserData {}
type TestResult = WVResult<i64>;
type TestView<'a> = WebView<'a, UserData>;
type TestBuilder<'a> =
WebViewBuilder<'a, UserData, fn(&mut TestView, &str) -> TestResult, &'static str>;
fn main() {
let p = UserData {};
let builder: TestBuilder = TestBuilder::new(); // error here
let webview = builder
.title("Progress") // error here
.content(Content::Url("https://en.m.wikipedia.org/wiki/Main_Page"))
.size(640, 960)
.resizable(true)
.debug(false)
.user_data(p)
.invoke_handler(handler)
.build()
.unwrap();
webview.run().unwrap();
}
fn handler(_webview: &mut TestView, _arg: &str) -> TestResult {
Ok(17 as i64)
}
最佳答案
TestView
你的定义:
type TestView = WebView<UserData>;
WebView
定义为:
pub struct WebView<'a, T: 'a> {
inner: *mut CWebView,
_phantom: PhantomData<&'a mut T>,
}
它期望生命周期和 T
,它必须与生命周期一样长。固定定义:
type TestView<'a> = WebView<'a, UserData>;
TestBuilder
你的定义:
type TestBuilder<'a> = WebViewBuilder< UserData: 'a,'a,
FnMut(&mut TestView, &str) -> TestResult, String>;
WebViewBuilder
定义为:
pub struct WebViewBuilder<'a, T: 'a, I, C>
pub title: &'a str,
pub content: Option<Content<C>>,
pub width: i32,
pub height: i32,
pub resizable: bool,
pub debug: bool,
pub invoke_handler: Option<I>,
pub user_data: Option<T>,
}
'a
lifetime必须在前,你在UserData
之后有它UserData
预期生命周期 -> UserData<'a>
, 不是 UserData: 'a
FnMut(...)
是一个特征,这意味着大小在编译时是未知的,你必须用 Box
包装它, 使用 fn
, ...C
是 String
在你的情况下,这意味着你不能使用 .content("hello")
,因为 a) 它期望 Content<C>
, b) 即使你使用 Content::Html("hello")
它不会工作,因为它是 Content<&'static str>
你说你想要Content<String>
-> Content::Html("hello".to_string())
固定定义:
type TestBuilder<'a> =
WebViewBuilder<'a, UserData, Box<dyn FnMut(&mut TestView, &str) -> TestResult>, String>;
WebViewBuilder
但即使您修复了所有这些问题,它也不会起作用。看WebViewBuilder
实现:
impl<'a, T: 'a, I, C> Default for WebViewBuilder<'a, T, I, C>
where
I: FnMut(&mut WebView<T>, &str) -> WVResult + 'a,
C: AsRef<str>
{...}
impl<'a, T: 'a, I, C> WebViewBuilder<'a, T, I, C>
where
I: FnMut(&mut WebView<T>, &str) -> WVResult + 'a,
C: AsRef<str>,
{...}
尤其是这一行:
I: FnMut(&mut WebView<T>, &str) -> WVResult + 'a
它期望WVResult
(-> Result<(), Error>
),这意味着你不能使用你的 TestResult
(-> WVResult<i64>
-> Result<i64, Error>
)。源代码中没有其他实现。
工作代码,确实使用了您的类型,但是 TestResult
只是WVResult
( i64
-> ()
)。
use web_view::*;
struct UserData {}
type TestResult = WVResult;
type TestView<'a> = WebView<'a, UserData>;
type TestBuilder<'a> =
WebViewBuilder<'a, UserData, Box<dyn FnMut(&mut TestView, &str) -> TestResult>, String>;
fn main() {
let p = UserData {};
let wvb: TestBuilder = WebViewBuilder::new();
let webview: TestView = wvb
.title("Progress")
.content(Content::Url(
"https://en.m.wikipedia.org/wiki/Main_Page".to_string(),
))
.size(640, 960)
.resizable(true)
.debug(false)
.user_data(p)
.invoke_handler(Box::new(handler))
.build()
.unwrap();
let _res = webview.run().unwrap();
}
fn handler(_webview: &mut TestView, _arg: &str) -> TestResult {
Ok(())
}
关于rust - 我在生命周期中遇到使用rust 编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57704706/
我正在开发一个使用多个 turtle 的滚动游戏。玩家 turtle 根据按键命令在 Y 轴上移动。当危害和好处在 X 轴上移动时,然后循环并改变 Y 轴位置。我尝试定义一个名为 colliding(
我不明白为什么他们不接受这个作为解决方案,他们说这是一个错误的答案:- #include int main(void) { int val=0; printf("Input:- \n
我正在使用基于表单的身份验证。 我有一个注销链接,如下所示: 以及对应的注销方法: public String logout() { FacesContext.getCurren
在 IIS7 应用程序池中有一个设置 Idle-time out 默认是 20 分钟,其中说: Amount of time(in minutes) a worker process will rem
我是一名优秀的程序员,十分优秀!