小编Luk*_*odt的帖子

有没有办法模拟Rust中的通用关联类型/关联类型构造函数?

我正在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的模式我可以用于这种情况?

我不想依赖动态调度并使用Boxdyn关键字.

我想为NodeIter我在模块中创建的每种类型的图形容器定义一个结构,并在容器本身的实现中添加"节点".但是,我发现这是糟糕的代码重用.

generics rust associated-types

2
推荐指数
1
解决办法
377
查看次数

使用unwrap_or解析整数或提供默认值,但在使用默认值时打印错误消息

我编写了一些解析配置文件的代码.如果配置文件包含它在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()

rust

2
推荐指数
1
解决办法
99
查看次数

如何制作动态索引以获取元组的值?

在 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)

但它不起作用,它只会给我一些错误。

tuples rust

2
推荐指数
1
解决办法
1287
查看次数

为什么要做dbg!和println!(“ {:?}”)显示不同的输出?

我原以为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

2
推荐指数
1
解决办法
88
查看次数

使用线程时 Rust 中 self 参数的生命周期

我正在学习 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

2
推荐指数
1
解决办法
1482
查看次数

Rust Borrow checker仅在返回具有相同生命周期分配的引用的函数时,多次抱怨多次借用mutable

我遇到一些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)

lifetime rust borrow-checker

1
推荐指数
2
解决办法
260
查看次数

取编译时已知的特定长度的切片

在这段代码中:

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
推荐指数
1
解决办法
2063
查看次数

Rust没有正确读取整数输入

我试图用一个简单的程序测试我的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)

rust

1
推荐指数
3
解决办法
410
查看次数

如何在使用防护时避免互斥借用问题

我希望我的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)

mutex rust

1
推荐指数
1
解决办法
548
查看次数

如何在向量的元素上运行for循环,并在rust中在for循环内和for循环外更改向量?

我是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)

您能解释为什么会发生移动吗?你可以编译吗?

for-loop move ownership rust borrow-checker

1
推荐指数
1
解决办法
60
查看次数