小编mca*_*ton的帖子

Option<Receiver> 在上一个循环迭代中移动

我正在生成一个线程来做一些工作。有时我希望这个线程在工作完成后死亡,其他时候我希望它等待更多的工作去做。为此,我传入了一个Option<Receiver<T>>. 如果Option<Receiver<T>>None线程应该死,否则就应该等待接收更多的工作。

fn foo(rx: Option<Receiver<usize>>) {
    thread::spawn(move || {
        loop {
            do_some_work();
            if let Some(r) = rx {
                match r.recv() {
                    Ok(x)  => {}
                    Err(_) => panic!("Oh no!"),
                }
            } else {
                break; //Die
            }
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

链接到操场

编译器说:

fn foo(rx: Option<Receiver<usize>>) {
    thread::spawn(move || {
        loop {
            do_some_work();
            if let Some(r) = rx {
                match r.recv() {
                    Ok(x)  => {}
                    Err(_) => panic!("Oh no!"),
                }
            } else {
                break; //Die …
Run Code Online (Sandbox Code Playgroud)

spawn receiver rust borrow-checker

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

将大于i32的数字存储到变量中时,为什么不出现文字超出范围的错误?

Rust文档说默认的整数类型是i32,这意味着变量默认可以保存的最大数字是2147483647ie 2e31 - 1。事实证明,这是千真万确的:如果我试图挽救数量大于2e31 - 1x变,我得到的错误literal out of range

fn main() {
    let x = 2147483647;
    println!("Maximum signed integer: {}", x);
    let x = 2e100;
    println!("x evalues to: {}", x);
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我2e100x变量中保存值,为什么我不会出错?它的计算结果肯定大于2e31 - 1

输出量

fn main() {
    let x = 2147483647;
    println!("Maximum signed integer: {}", x);
    let x = 2e100;
    println!("x evalues to: {}", x);
}
Run Code Online (Sandbox Code Playgroud)

fn main() {
    let …
Run Code Online (Sandbox Code Playgroud)

types literals rust

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

Rust 基本的 while 循环

(希望如此)来自一个完整的 Rust 初学者的一个简单问题。我的循环有什么问题?

num评估为 '69' 相当快,但一旦num设置为 '69' ,循环永远不会退出。我错过了一些明显的东西,我敢肯定......

extern crate rand;

use rand::Rng;

fn main() {
    let funny_number: u16 = 69;
    let mut num: u16 = 0;
    let mut rng = rand::thread_rng();

    while num != funny_number {
        let mut num: u16 = rng.gen_range(0, 100);
        println!("{}", num);
    }
}
Run Code Online (Sandbox Code Playgroud)

rust

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

使用对另一个哈希图的引用克隆一个哈希图

我有一个哈希映射的引用(data在下面的代码中),我想将其克隆到一个新的、拥有的哈希映射中。克隆参考给了我一个新的参考,这不是我需要的。

我还尝试对data引用进行迭代 + 映射,并单独克隆键和值对,然后进行收集,但这也不起作用。这是一个最小的工作示例:

use core::cell::Cell;
use std::collections::HashMap;
use std::collections::HashSet;
use std::rc::Rc;

struct Dummy<K, V> {
    dirty: Rc<Cell<bool>>,
    data: Cell<Option<HashMap<K, HashSet<V>>>>,
}

impl<K, V> Dummy<K, V> {
    fn persist(&self, prefix: &str, data: &HashMap<K, HashSet<V>>) {
        self.dirty.set(true);
        self.data.set(Some(data.clone()));
    }
}
Run Code Online (Sandbox Code Playgroud)

这给出了以下错误:

error[E0308]: mismatched types
  --> src/lib.rs:14:28
   |
14 |         self.data.set(Some(data.clone()));
   |                            ^^^^^^^^^^^^ expected struct `std::collections::HashMap`, found reference
   |
   = note: expected type `std::collections::HashMap<K, std::collections::HashSet<V>>`
              found type `&std::collections::HashMap<K, std::collections::HashSet<V>>`
Run Code Online (Sandbox Code Playgroud)

固定链接到操场

这段代码的目的是通过Dummystruct观察hashmap的内容,用于单元测试。

我猜这个问题是因为给定泛型类型没有办法确定如何深度克隆键和值对象?

有没有办法在给定对现有哈希图的引用的情况下创建新的哈希图?

reference hashmap rust

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

检查 Vec 是否包含来自另一个 Vec 的所有元素

There is a method contains that can be used to check if a particular element exists in a Vec. How to check if all elements from a Vec are contained in another Vec? Is there something more concise than iterating manually and checking all elements explicitly?

collections vector rust

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

Rust中的Foo(bar)= zar是什么?

我正在阅读https://www.abubalay.com/blog/2018/04/08/recursive-ascent,它做了我无法理解的事情

let Elements(array) = elements;
Run Code Online (Sandbox Code Playgroud)

这种表达是什么意思?它在创建array变量吗?那Elements(...)!!

问候

pattern-matching rust

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

为什么 len() 和 is_empty() 没有在特征中定义?

拉斯特大部分图案由性状(捕获IteratorFromBorrow,等)。

为什么像len/这样普遍的模式is_empty在标准库中没有相关特征?这会导致我无法预见的问题吗?被认为是无用的吗?或者只是没有人想到它(这似乎不太可能)?

traits rust

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

过载运算符+ for vector:namespace std

我试图重载运算符+和+ = std :: vector,我做的是

namespace std {
    template<class T>
    vector<T> operator+(vector<T> x, vector<T> y) {
        vector<T> result;
        result.reserve(x.size());
        for (size_t i = 0; i < x.size(); i++)
            result[i] = x[i] + y[i];
        return result;
   }
}
Run Code Online (Sandbox Code Playgroud)

但我认为这是不好的做法,因为clang-tidy警告我"修改std命名空间会导致未定义的行为".在为STL类重载运算符时还有其他更好的做法吗?

c++ vector std

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

为什么我们不需要在某些rust迭代器中从Result提取值?

在这里,我有一个简单的映射并通过迭代器求和:

fn main() {
    let s = "
aoeu
aoeu
aoeu
aoeu
";

    let ls = s.lines();
    let i: usize = ls.map(|l| l.len()).sum();
    dbg!(i);
}
Run Code Online (Sandbox Code Playgroud)

这样可以编译并正常运行。当我查看源代码时lines,该next方法返回Option<Result<String>>

但是上面的地图.len()直接调用每个项目。我知道该值是从内部提取的Option(一个None值表示迭代器的结尾)。是.len()被调用的Result对象?为什么我们不需要调用map()*来从中提取值Result呢?

谢谢!

*我原以为Result::map与含义不同Iterator::map,但也许让我感到困惑...

rust

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

当我在字符串中编码数字时,为什么会出现“尝试添加溢出”?

我的编码函数是这样的:

fn encode_login(packet: &str) {
    let bytes = packet.as_bytes();
    for (i, &element) in bytes.iter().enumerate() {
        println!("Index: {}, Byte: {}", i, &element);
        let decoded = (element ^ 0xC3) + 0xF;
        println!("Decoded Byte: {}", decoded);
    }
}

fn main() {
    // let packet = "0123456789"; // Doesn't work
    let packet = "abcdefghijklmnopqrstuvwxyz"; // Work

    encode_login(packet);
}
Run Code Online (Sandbox Code Playgroud)

当我使用字母时,程序会很好地对其进行加密,但是当我输入数字时,它会出现恐慌。我不知道为什么,我是 Rust 的新手,所以也许我做错了什么。

rust

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

用匹配替换条件

我正在努力改进我的match表达方式。

我有一个类似下面的代码,其中foo是一个字符串:

if foo.chars().nth(0).unwrap() != '2' && 
    foo.chars().nth(0).unwrap() != '3' &&
    &foo[0..3] != "xyz"
    {
        return message;
    }
Run Code Online (Sandbox Code Playgroud)

是否可以使用匹配来创建相同的行为?像这样的想法:

match foo {
   &[0] == (2 | 3) => do_nothing
   &[0..3] == "xyz" => do_nothing
   _ => return message;
}
Run Code Online (Sandbox Code Playgroud)

match rust

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