- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
虽然下面的代码是一个早期的原型(prototype),关于我在这个阶段如何实现 Protocol Buffer 不要太认真,但我无法理解 rust 编译器祝福我的错误消息指的是什么。
src\main.rs:89:9: 89:36 error: type mismatch resolving
for<'r> <[closure src\ma
: expected bound lifetime parameter , found concrete lifetime [E0271] src\main.rs:89 gpb::decoding::read_message( source, field_handler );
in.rs:75:33: 88:10] as core::ops::FnOnce<(u32, gpb::definitions::WireType, &'r collections::vec::Vec<u8>, usize)>>::Output == usize
即使在阅读了关于 lifetimes 等的 3 个文档章节之后。阿尔。我没有遇到“具体生命周期”这个词,因此很难弄清楚这个错误与什么代码有关。闭包本身,一个或多个参数,返回码?关闭传递给 read_message()
? ...
main.rs 片段
fn from_gpb( source : &Vec<u8>) -> TimeMessage {
fn init_vec_u64( count : usize, init_value : u64) -> Vec<u64> {
let mut result = Vec::<u64>::with_capacity(count);
for i in 0..count {
result.push(init_value);
}
result
}
let mut message_id : u32 = 0;
let mut times_sec = init_vec_u64(4,0u64);
let mut times_usec = init_vec_u64(4,0u64);
let mut max_time_index = 0;
let mut time_index = | index | { if max_time_index < index { max_time_index = index;}};
let mut field_handler = |tag,wire_type,source,position| -> usize {
match (tag,wire_type) {
(1u32,gpb::definitions::WireType::Varint) => {let (v,p) = gpb::decoding::read_varint32(source,position); message_id = v; p},
(2u32,gpb::definitions::WireType::Fixed64) => {let (sec,p) = gpb::decoding::read_fixed64(source,position); times_sec[0] = sec; time_index(0); p},
(3u32,gpb::definitions::WireType::Fixed64) => {let (usec,p) = gpb::decoding::read_fixed64(source,position); times_usec[0] = usec; time_index(0); p},
(4u32,gpb::definitions::WireType::Fixed64) => {let (sec,p) = gpb::decoding::read_fixed64(source,position); times_sec[1] = sec; time_index(1);p},
(5u32,gpb::definitions::WireType::Fixed64) => {let (usec,p) = gpb::decoding::read_fixed64(source,position); times_usec[1] = usec; time_index(1);p},
(6u32,gpb::definitions::WireType::Fixed64) => {let (sec,p) = gpb::decoding::read_fixed64(source,position); times_sec[2] = sec; time_index(2);p},
(7u32,gpb::definitions::WireType::Fixed64) => {let (usec,p) = gpb::decoding::read_fixed64(source,position); times_usec[2] = usec; time_index(2); p},
(8u32,gpb::definitions::WireType::Fixed64) => {let (sec,p) = gpb::decoding::read_fixed64(source,position); times_sec[3] = sec; time_index(3); p},
(9u32,gpb::definitions::WireType::Fixed64) => {let (usec,p) = gpb::decoding::read_fixed64(source,position); times_usec[3] = usec; time_index(3); p},
(_,_) => panic!("Invalid field tag/wire_type combination!") // TODO: change the panic to a gpb::decoding::skip(..) call.
}
};
gpb::decoding::read_message( source, field_handler );
let mut make_times = || -> Vec<prectime::PrecTime> {
let time_count = max_time_index+1;
let mut times = Vec::<prectime::PrecTime>::with_capacity(time_count);
times_sec.truncate(time_count);
times_usec.truncate(time_count);
for i in 0..time_count {
times.push(prectime::PrecTime { sec : times_sec[i], usec : times_usec[i]});
}
times
};
TimeMessage { id : message_id, times : make_times() }
}
gpb.rs 片段
pub fn read_message<F>( source : &Vec<u8>, field_handler : F) where F: Fn(u32,super::definitions::WireType, &Vec<u8>, usize) -> usize {
let mut cursor = 0;
while cursor < source.len() {
let (tag_and_wire_type, position) = read_varint32( source, cursor );
let wt = super::definitions::wire_type_from_value( tag_and_wire_type & 0x07u32 );
let tag = (tag_and_wire_type >> 3);
let new_pos = field_handler(tag,wt, source,position);
cursor = new_pos;
}
}
代码的作用总结:
任何东西(闭包、调用、向量、field_handler 写入 from_gpb()
上下文,...)都是在 from_gpb()
中定义的功能,我根本不明白生命周期怎么会成为问题。所有关于生命周期的信息都应该提供给编译器。
最佳答案
首先,如果您想要一个快速的答案,您应该付出一些努力来编写一个最小的、可编译的示例,这样人们就不必猜测潜在的解决方案是否可行。像这样:
enum WireType {}
fn from_gpb(source: &Vec<u8>) {
let mut field_handler = |tag, wire_type, source, position| -> usize {
let tag: u32 = tag;
let wire_type: WireType = wire_type;
let source: &Vec<u8> = source;
let position: usize = position;
panic!();
};
read_message(source, field_handler);
}
fn read_message<F>(source: &Vec<u8>, field_handler: F)
where
F: Fn(u32, WireType, &Vec<u8>, usize) -> usize,
{
panic!();
}
此答案的其余部分基于以上出现以复制您的问题:
error[E0631]: type mismatch in closure arguments
--> src/lib.rs:11:5
|
4 | let mut field_handler = |tag, wire_type, source, position| -> usize {
| ------------------------------------------- found signature of `fn(u32, WireType, &std::vec::Vec<u8>, usize) -> _`
...
11 | read_message(source, field_handler);
| ^^^^^^^^^^^^ expected signature of `for<'r> fn(u32, WireType, &'r std::vec::Vec<u8>, usize) -> _`
|
note: required by `read_message`
--> src/lib.rs:14:1
|
14 | / fn read_message<F>(source: &Vec<u8>, field_handler: F)
15 | | where
16 | | F: Fn(u32, WireType, &Vec<u8>, usize) -> usize,
17 | | {
18 | | panic!();
19 | | }
| |_^
error[E0271]: type mismatch resolving `for<'r> <[closure@src/lib.rs:4:29: 10:6] as std::ops::FnOnce<(u32, WireType, &'r std::vec::Vec<u8>, usize)>>::Output == usize`
--> src/lib.rs:11:5
|
11 | read_message(source, field_handler);
| ^^^^^^^^^^^^ expected bound lifetime parameter, found concrete lifetime
|
note: required by `read_message`
--> src/lib.rs:14:1
|
14 | / fn read_message<F>(source: &Vec<u8>, field_handler: F)
15 | | where
16 | | F: Fn(u32, WireType, &Vec<u8>, usize) -> usize,
17 | | {
18 | | panic!();
19 | | }
| |_^
最简单的做法是让编译器正确推断闭包类型:
fn from_gpb_closure_inference(source: &Vec<u8>) {
read_message(source, |tag, wire_type, source, position| -> usize {
let tag: u32 = tag;
let wire_type: WireType = wire_type;
let source: &Vec<u8> = source;
let position: usize = position;
panic!();
});
}
只有当闭包直接作为函数的参数提供时,闭包推理才能真正正常工作。理论上,两者应该是等价的,但它们不是。
您可以做的另一件事是欺骗编译器,使其在实际上不使用闭包的情况下进行推理:
fn constrain_handler<F>(f: F) -> F
where
F: Fn(u32, WireType, &Vec<u8>, usize) -> usize,
{
f
}
fn from_gpb_constrain(source: &Vec<u8>) {
let mut field_handler = constrain_handler(|tag, wire_type, source, position| -> usize {
let tag: u32 = tag;
let wire_type: WireType = wire_type;
let source: &Vec<u8> = source;
let position: usize = position;
panic!();
});
read_message(source, field_handler);
}
在这种情况下,constrain_handler
函数只是让编译器确定闭包的类型,以便稍后使用(或不使用)。
关于rust - 预期绑定(bind)生命周期参数,找到具体生命周期 [E0271],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31362206/
我有一个 foo 类,它有一个 bar 方法,它接受可调用的东西(函数指针/仿函数)。这个可调用的东西应该作为绑定(bind)元素传递给另一个方法 doit 和第三个方法 bar_cb 方法。 #in
我正在尝试在我的 WPF 4.0 应用程序(使用 VS 2010 Pro RTM)中创建自定义 TabItem 模板/样式,但尽管一切似乎都正常工作,但我注意到跟踪窗口中存在绑定(bind)错误。 我
作为一名刚接触 Android 的开发人员,我想我可能误解了绑定(bind)服务。 我创建了一项服务来结束对服务器的访问。作为此服务的一部分,该服务正在监听多播地址,以识别本地网络上的设备何时出现和消
这个问题在这里已经有了答案: What is the use of the JavaScript 'bind' method? (23 个回答) 关闭 7 年前。 所以我一直在尝试了解一些 JS 上
我不明白这三种语法之间的区别: where a = f (b) do a <- f (b) do let a = f (b) 我确实明白了a <- f(b)与其他两个不同,在大多数情况下,我尝试了所有
我在将 Cocoa 项目从手动同步接口(interface)模型转换为绑定(bind)模型时遇到问题,这样我就不必担心接口(interface)粘合代码。 我关注了 CocoaDevCentral C
我正在尝试找出一种好的方法来对处理大数据集的代码进行并行化,然后将结果数据导入 RavenDb。 数据处理受 CPU 限制和数据库导入 IO 限制。 我正在寻找一种解决方案,以对 Environmen
我正在 foreach 循环中生成单选按钮。我试图将选中的属性绑定(bind)到父级中的基本可观察值。不幸的是,当单击单选按钮时,父级的属性似乎没有在单击处理程序中更新。 基于一些previous w
在我的 Windows Phone 应用程序中,我有两个 LongListSelectors并排在页面上。我想做到这一点,以便当用户滚动其中一个时,另一个滚动相同的量。 两个 LongListSele
我在网上看到这个问题准备面试: Given a non-preemptive kernel which type of process will get affected morein terms o
我有一个 foreach 绑定(bind),如下所示: Summary Permitting 原因是有两个选项卡始终存在,并且我根据是否添加了其他选项卡来添加其他选项
任何人都有绑定(bind)相同的情况DataContext到 TextBlock 中的 Text 属性(例如)。 我必须分配 DataContext以我的风格反射(reflect)基于 Datacon
给定以下代码: Login 和下面的javascript $(function () { $('#btnLogin').click(function () { co
我使用 boost::asio 创建了一个服务器。我在绑定(bind)到端点时遇到问题。所以,如果我在构造函数中初始化一个接受器: Server::Server(QWidget *parent) :
我正在将现有项目从 MySQL 转换为 Postgres。代码中有相当多的原始 SQL 文字使用 ? 作为占位符,例如 SELECT id FROM users WHERE
似乎在绑定(bind)某些数据时出错了,有人可以帮我解决我哪里出错了,尽管我无法弄清楚。 真的不需要在这里显示太多,这是 Binding,我已经通过移除背景并在其中放置颜色来测试背景,效果很好。 编辑
我正在尝试使用 wcf 构建一个 http 监听器(web 服务)。这个监听器是一个更大的桌面应用程序的一部分。此桌面应用程序还会调用 http 监听器。 当监听器接收到数据时,它应该被传递到桌面应用
嘿嘿。 我正在使用 Node.JS 和 child_process 来生成 bash 进程。我试图了解我是否正在执行 I/O 绑定(bind)、CPU 绑定(bind)或两者兼而有之。 我正在使用 p
尝试执行以下操作并出现“Got interpolation ({{}}) where expression was expected”错误。 {{item.name}} 谢谢!
我有一个导入的 Java 库,它是我解决方案中的“绑定(bind)库”项目。 我正在尝试从解决方案中的另一个项目绑定(bind)到第 3 方库中的服务。 第 3 方库文档 [在 java 中] 非常简
我是一名优秀的程序员,十分优秀!