我正在Rust中制作一个图形处理模块.该模块的核心模型是拥有多个容器的想法,这些容器将数据保存在图表中.例如,我可能有一个内部结构是HashMap或可能AdjacencyMatrix等的图形.
这些容器必须实现一个特性:
trait GraphData<V> {
fn has_edge(&self, v: &V, u: &V) -> bool;
fn nodes(&self) -> Iterator<V>; // Here's the problem...
}
Run Code Online (Sandbox Code Playgroud)
我不能只在我的特质定义中返回一个特征.我知道我必须使用特质对象,但我不想这样做Box.我想让容器提供自己的NodeIter结构.但是,我会遇到在Associated类型构造函数中解释的相同问题,第1部分:基本概念和介绍.该帖子解释了现在Rust中不存在的相关类型构造函数(ATC).我GraphData类似于Collection描述的通用.
是否有任何解决方法我可以用来"模拟"ATC或任何特定于Rust的模式我可以用于这种情况?
我不想依赖动态调度并使用Box或dyn关键字.
我想为NodeIter我在模块中创建的每种类型的图形容器定义一个结构,并在容器本身的实现中添加"节点".但是,我发现这是糟糕的代码重用.
我编写了一些解析配置文件的代码.如果配置文件包含它在Configstruct中设置的字段的有效值.如果未找到设置的有效整数值,则设置默认值(例如:90).
let config = Config {
interval: settings.get("interval").unwrap().parse().unwrap_or(90),
}
Run Code Online (Sandbox Code Playgroud)
如何让它关闭,以便它可以打印error!并设置默认值?
看起来如下:
let config = Config {
interval: settings.get("interval").unwrap().parse().unwrap_or({
error!("No interval found. Using default: 90");
90
});
}
Run Code Online (Sandbox Code Playgroud)
但在此示例中,error!即使从配置中读取了间隔中的有效值,也始终执行该操作.
我怎样才能使unwrap_or只在失败optb时执行代码parse()?
在 Python 中,我了解到可以通过动态索引检索元组值:
data = (1,2,3,4)
data[0]
for a in range(len(data)):
print(data[a])
Run Code Online (Sandbox Code Playgroud)
输出:
1
2
3
4
Run Code Online (Sandbox Code Playgroud)
如何在 Rust 中做到这一点?
我试过这样的事情:
1
2
3
4
Run Code Online (Sandbox Code Playgroud)
但它不起作用,它只会给我一些错误。
我原以为dbg!(x)和println!("{:?}", x)既能打印相同的字符串,因为{:?}用于调试输出,对不对?
如果我没记错的话,为什么我们会看到这个结果,一个显示在单行中,而另一个显示在多行中?
fn main() {
let x: Vec<u32> = (0..10).collect();
println!("{:?}", x[0..1].to_vec());
dbg!(x[0..1].to_vec());
}
Run Code Online (Sandbox Code Playgroud)
[src/main.rs:4] x[0..1].to_vec() = [
0,
]
[0]
Run Code Online (Sandbox Code Playgroud)
我正在学习 Rust,我有这个代码:
use std::sync::{Arc, Mutex};
use std::thread::spawn;
pub struct MyText {
my_text: Mutex<Vec<String>>,
}
pub trait MyTextOptions {
fn add(&self, t: String);
}
impl MyTextOptions for MyText {
fn add(&self, text: String) {
let int_text = Arc::new(self);
let put_into_my_text = spawn(move || {
let mut text_feed = int_text.my_text.lock().unwrap();
text_feed.push(text)
});
put_into_my_text.join();
}
}
Run Code Online (Sandbox Code Playgroud)
当我尝试运行它时,我得到:
use std::sync::{Arc, Mutex};
use std::thread::spawn;
pub struct MyText {
my_text: Mutex<Vec<String>>,
}
pub trait MyTextOptions {
fn add(&self, t: String);
}
impl MyTextOptions for MyText { …Run Code Online (Sandbox Code Playgroud) 我遇到一些Rust代码的问题,我被允许在某些条件下(第一个令人困惑的部分)不止一次地借用一些东西,而不是其他东西.
我写了下面的例子来说明:( 游乐场)
struct NoLifetime {}
struct WithLifetime <'a> {
pub field: &'a i32
}
fn main() {
let mut some_val = NoLifetime {};
borrow_mut_function(&mut some_val);
borrow_mut_function(&mut some_val); // Borrowing as mutable for the second time.
let num = 5;
let mut life_val = WithLifetime { field: &num };
borrow_lifetime(&mut life_val);
borrow_lifetime(&mut life_val); // Borrowing as mutable for the second time.
let num_again = borrow_lifetime(&mut life_val); // Borrow, assign lifetime result
borrow_lifetime(&mut life_val); // Compiler: cannot borrow `life_val` as …Run Code Online (Sandbox Code Playgroud) 在这段代码中:
fn unpack_u32(data: &[u8]) -> u32 {
assert_eq!(data.len(), 4);
let res = data[0] as u32 |
(data[1] as u32) << 8 |
(data[2] as u32) << 16 |
(data[3] as u32) << 24;
res
}
fn main() {
let v = vec![0_u8, 1_u8, 2_u8, 3_u8, 4_u8, 5_u8, 6_u8, 7_u8, 8_u8];
println!("res: {:X}", unpack_u32(&v[1..5]));
}
Run Code Online (Sandbox Code Playgroud)
该函数unpack_u32只接受长度为 4 的切片。有没有办法assert_eq用编译时检查替换运行时检查?
我试图用一个简单的程序测试我的Rust技能,该程序从一行输入中读取多个整数.它编译正确,但不幸的是,当它收到输入时1 2 3,它会发生恐慌,说输入不是有效的整数.有人可以解释一下这个的原因,并解释我如何修复我的程序?
use std::io;
fn main() {
let mut string = String::new();
io::stdin().read_line(&mut string);
let int_vec: Vec<u32> = string.split(" ")
.map(|x| x.parse::<u32>().expect("Not an integer!"))
.collect();
for i in (0..int_vec.len()).rev() {
print!("{} ", int_vec[i]);
}
}
Run Code Online (Sandbox Code Playgroud) 我希望我的struct方法以同步方式执行.我想通过使用Mutex(游乐场)来做到这一点:
use std::sync::Mutex;
use std::collections::BTreeMap;
pub struct A {
map: BTreeMap<String, String>,
mutex: Mutex<()>,
}
impl A {
pub fn new() -> A {
A {
map: BTreeMap::new(),
mutex: Mutex::new(()),
}
}
}
impl A {
fn synchronized_call(&mut self) {
let mutex_guard_res = self.mutex.try_lock();
if mutex_guard_res.is_err() {
return
}
let mut _mutex_guard = mutex_guard_res.unwrap(); // safe because of check above
let mut lambda = |text: String| {
let _ = self.map.insert("hello".to_owned(),
"d".to_owned());
};
lambda("dd".to_owned());
}
} …Run Code Online (Sandbox Code Playgroud) 我是Rust的新手。我需要在for循环之前创建一个向量。运行循环。在for循环内更改向量。然后在for循环之后更改向量。
我尝试了以下代码,并尝试使用不可变借位,但两者均无效。
fn main() {
let mut vec1 = vec![4, 5];
vec1.push(6);
for i in vec1 {
if i % 2 == 0 {
vec1.push(7);
}
}
vec1.push(8);
println!("vec1={:?}", vec1);
}
Run Code Online (Sandbox Code Playgroud)
我希望在for循环内和之后编译和更改向量。但它显示此错误消息:
fn main() {
let mut vec1 = vec![4, 5];
vec1.push(6);
for i in vec1 {
if i % 2 == 0 {
vec1.push(7);
}
}
vec1.push(8);
println!("vec1={:?}", vec1);
}
Run Code Online (Sandbox Code Playgroud)
您能解释为什么会发生移动吗?你可以编译吗?