下面的代码基于Herb Sutter关于.then()类型延续的实现的想法.
template<typename Fut, typename Work>
auto then(Fut f, Work w)->std::future<decltype(w(f.get()))>
{ return std::async([=] { w(f.get()); }); }
Run Code Online (Sandbox Code Playgroud)
这可以像auto next = then(f, [](int r) { go_and_use(r); });或类似地使用.
这是一个很好的想法,但它现在不起作用(期货只是移动而不是可复制的).我喜欢这个想法,因为它可能出现在即将推出的c ++版本中,据我所知(尽管是.then()甚至是等待.)
在让期货共享或类似之前,我想知道堆栈溢出社区会特别考虑改进和建议(甚至是共享期货)对这种实现的看法?
在此先感谢您的任何建议.
(我知道这是一个修复,直到基于标准的机制存在,因为它将花费一个线程(也许))).
我试图找出从矢量转换为数组并返回的最类似Rust的方式.这些宏可以工作,甚至可以通过一些不安全的块来制作通用,但它们都觉得非常不像Rust.
我会很感激任何输入并且没有任何打击,我认为这段代码远非好或不优.我现在只玩Rust几周了,追逐发布和文档,所以非常感谢帮助.
macro_rules! convert_u8vec_to_array {
($container:ident, $size:expr) => {{
if $container.len() != $size {
None
} else {
use std::mem;
let mut arr : [_; $size] = unsafe { mem::uninitialized() };
for element in $container.into_iter().enumerate() {
let old_val = mem::replace(&mut arr[element.0],element.1);
unsafe { mem::forget(old_val) };
}
Some(arr)
}
}};
}
fn array_to_vec(arr: &[u8]) -> Vec<u8> {
let mut vector = Vec::new();
for i in arr.iter() {
vector.push(*i);
}
vector
}
fn vector_as_u8_4_array(vector: Vec<u8>) -> [u8;4] {
let mut arr = …Run Code Online (Sandbox Code Playgroud) 我试图在Rust中使用带有迭代器的模式并在某处掉落,显然很简单.
我想迭代一个容器并找到一个带有谓词[A](简单)的元素,但是然后使用另一个谓词向前看并得到该值[B]并使用[B]以某种方式改变[A].在这种情况下,[A]是可变的,[B]可以是不可变的; 这对我没有任何影响,只对借阅检查员(正确).
通过一个简单的场景来理解这一点很有帮助,所以我添加了一个小片段让民众看到问题/尝试的目标.我玩过itertools并进入for/while循环,尽管我希望尽可能保持惯用.
愚蠢的示例场景
查找偶数,找到可被3整除的下一个数字并添加到初始数字.
#[allow(unused)]
fn is_div_3(num: &u8) -> bool {
num % 3 == 0
}
fn main() {
let mut data: Vec<u8> = (0..100).collect();
let count = data.iter_mut()
.map(|x| {
if *x % 2 == 0 {
// loop through numbers forward to next is_div_3,
// then x = x + that number
}
true
})
.count();
println!("data {:?}, count was {} ", data, count);
}
Run Code Online (Sandbox Code Playgroud)
对不起新手问题.这里的错误是
<anon>:30:5: 30:17 error: cannot borrow immutable borrowed content as mutable
<anon>:30 routing_node.put(3);
^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)
我已经尝试了很多东西来解决这个问题,但我知道这是一个简单的错误.任何帮助非常感谢.
use std::thread;
use std::thread::spawn;
use std::sync::Arc;
struct RoutingNode {
data: u16
}
impl RoutingNode {
pub fn new() -> RoutingNode {
RoutingNode { data: 0 }
}
pub fn run(&self) {
println!("data : {}", self.data);
}
pub fn put(&mut self, increase: u16) {
self.data += increase;
}
}
fn main() {
let mut routing_node = Arc::new(RoutingNode::new());
let mut my_node = routing_node.clone();
{
spawn(move || {my_node.run(); …Run Code Online (Sandbox Code Playgroud)