相关疑难解决方法(0)

为什么不鼓励接受对String(&String),Vec(&Vec)或Box(&Box)的引用作为函数参数?

我写了一些Rust代码&String作为参数:

fn awesome_greeting(name: &String) {
    println!("Wow, you are awesome, {}!", name);
}
Run Code Online (Sandbox Code Playgroud)

我还编写了代码来引用a VecBox:

fn total_price(prices: &Vec<i32>) -> i32 {
    prices.iter().sum()
}

fn is_even(value: &Box<i32>) -> bool {
    **value % 2 == 0
}
Run Code Online (Sandbox Code Playgroud)

但是,我收到一些反馈意见,这样做并不是一个好主意.为什么不?

string reference rust borrowing

100
推荐指数
2
解决办法
5549
查看次数

如何在Rust中对"选项"分配进行分组?

我有一段代码,需要一次分配多个可选变量.任何值都很少有机会None,因此单独处理每个失败的案例并不是特别有用.

目前我写这样的支票:

if let Some(a) = foo_a() {
    if let Some(b) = foo_b() {
        if let Some(c) = foo_c() {
            if let Some(d) = foo_d() {
                // code
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果可以对作业进行分组会很方便.如果没有这个,添加一个新变量会将块缩进一级,从而产生噪声差异并导致不必要的深度缩进:

if let Some(a) = foo_a() &&
   let Some(b) = foo_b() &&
   let Some(c) = foo_c() &&
   let Some(d) = foo_d()
{
    // code
}
Run Code Online (Sandbox Code Playgroud)

有没有办法Option在一个if语句中分配多个s?


一些值得注意的细节:

失败的第一个功能应该是短路而不是呼叫其他功能.否则,可以这样写:

if let (Some(a), Some(b), Some(c), Some(d)) = (foo_a(), foo_b(), foo_c(), foo_d()) {
    // Code
}
Run Code Online (Sandbox Code Playgroud)

使用函数可以避免深度缩进,但我不想这样做,因为你可能不希望将主体放在不同的范围内...... …

variable-assignment rust

8
推荐指数
3
解决办法
332
查看次数

如何将编译时未知数量的迭代器压缩在一起?

我有许多由用户输入指定的 Rust 迭代器,我想以锁步方式进行迭代。

这听起来像是一个类似 的工作Iterator::zip,只是我可能需要将两个以上的迭代器压缩在一起。我查看了itertools::multizipitertools::izip,但是它们都要求在编译时知道要压缩的迭代器的数量。对于我的任务,要压缩在一起的迭代器数量取决于用户输入,因此在编译时无法知道。

我希望有类似Pythonzip函数的东西,它需要一个可迭代的可迭代对象。我想函数签名可能看起来像:

fn manyzip<T>(iterators: Vec<T>) -> ManyZip<T>
where
    T: Iterator
Run Code Online (Sandbox Code Playgroud)

如何压缩两个以上的迭代器?仅针对编译时已知迭代器数量的情况。

我可以使用索引等解决我的特定问题,只是感觉应该有更好的方法。

iterator rust

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