我对锈病很陌生,看上去我真的很想念这个概念。
use std::thread;
fn main() {
let mut children = vec![];
//spawn threads
for i in 0..10 {
let c = thread::spawn(|| {
println!("thread id is {}", i);
});
children.push(c);
}
for j in children {
j.join().e
这段代码
let vec = vec![1, 3, 4, 5, 6];
for i in vec.iter().filter(|x| x % 2 == 0) {
println!("{}", i);
}
产生错误
<anon>:4:36: 4:37 error: binary operation `%` cannot be applied to type `&&_` [E0369]
<anon>:4 for i in vec.iter().filter(|x| x % 2 == 0) {
锈蚀文档在部分中有此示例。
let nums = vec![1, 2, 3];
let takes_nums = || nums;
println!("{:?}", nums);
文件上说
但是,如果您的关闭需要它,Rust将获得所有权,转而移动环境。
而上面的代码将导致此错误。
note: `nums` moved into closure environment here because it has type
`[closure(()) -> collections::vec::Vec<i32>]`, which is non-copya
我正在阅读Rust这本书,并且我在描述闭包的章节中。我有点困惑,为什么下面的例子会因为闭包取得所有权而出错:
fn main() {
let x = vec![1, 2, 3];
let equal_to_x = move |z| z == x;
println!("can't use x here: {:?}", x);
let y = vec![1, 2, 3];
assert!(equal_to_x(y));
}
也就是说,为什么equal_to_x在x被调用之前就取得了它的所有权?编译器不应该知道闭包还没有被调用(因为它归main所有),因此x仍然可以归
如果我有以下代码:
let a = 1;
let f = |n| n == &a;
let _: Vec<_> = (1u64..10).filter(f).collect();
Rust非常抱怨相关的Filter结构存在collect,但是闭包不满足特征绑定的FnMut。
但是,如果我内联闭包或注释它的参数类型,代码就能正常工作,例如:
let a = 1;
let _: Vec<_> = (1u64..10).filter(|n| n == &a).collect();
或者:
let a = 1;
let f = |n: &u64| n =
我想了解为什么下面示例中的外部堆栈变量data不需要在闭包中使用move关键字。
示例取自,声明write_function的生存期来自transfer变量,因此闭包可以访问堆栈变量data而不移动它。
这里引用了文档中的一句话:
请注意,此函数的生存期范围是“静态的,但这通常是过于限制性的。”要使用堆栈数据,请考虑调用传输方法,然后使用write_function配置可以引用堆栈本地数据的回调。
请参阅:
use curl::easy::Easy;
let mut data = Vec::new();
let mut handle = Easy::new();
handle.url
我在Rust中有一个迭代器,它循环遍历Vec<u8>,并在两个不同的阶段应用相同的函数。我通过将两个map函数链接在一起来做到这一点。以下是相关代码(例如,example_function_1和example_function_2分别是替代变量和函数):
注意:example.chunks()是一个自定义函数!不是切片上的默认版本!
let example = vec![0, 1, 2, 3];
let mut hashers = Cycler::new([example_function_1, example_function_2].iter());
let ret: Vec&
我对Rust很陌生,并试图理解基本的目录遍历。我找到的几乎所有示例都使用了walkdir或glob库,我在其中取得了很好的成功。但是,我现在只想用std库来完成这个任务。
标准库文档中有一个,列出了以下函数:
fn visit(path: &Path, cb: &dyn Fn(&PathBuf)) -> io::Result<()> {
for e in read_dir(path)? {
let e = e?;
let path = e.path();
if path.is_dir() {
我正尝试在Rust中同时使用空格和,来拆分字符串。我试着去做
let v: Vec<&str> = "Mary had a little lamb".split_whitespace().collect();
let c: Vec<&str> = v.split(',').collect();
结果是:
error[E0277]: the trait bound `for<'r> char: std::ops::FnMut<(&'r &str,)>` is not
我正在试着读取和解析一个在Rust中的文本文件。每一行都是有符号整数。我可以使用for line in lines迭代来完成它,但是我不能用iter().map(|l| ...)一行程序来完成它。我得到了一个
expected `&core::result::Result<collections::string::String, std::io::error::Error>`,
found `core::result::Result<_, _>`
当我尝试模式匹配Ok(s) => match s.parse(),但我无法弄清楚我做错了什么。下面是整个例子。
在Rust中,像这样匹配一个值是可行的。 let x = 1;
match x {
1 => println!("one"),
2 => println!("two"),
_ => println!("something else")
} 但是,在match中使用向量值而不是硬编码的数字是行不通的。 let x = 1;
let list = vec![1, 2];
match x {
list[0] => println!("one"),
list[1] =&
我在一系列盒式值上有一个迭代器。我想将这个迭代器映射到一个对装箱值的可变引用上。
下面的简化示例演示如何对不可变的引用完成此操作。这个例子编译得很好。
let indices = [0usize, 1usize, 2usize];
let vec = vec![Box::new(1.0), Box::new(2.0), Box::new(3.0)];
let i = indices.iter().map(|index| vec[*index].deref()).map(|x| *x + 1.0);
但是,对于可变引用(如下面的示例),编译器将生成一个错误。
let indices = [0us