Struct 如何创建函数local static`HashSet<;char>;`初始化一次?

Struct 如何创建函数local static`HashSet<;char>;`初始化一次?,struct,static,initialization,rust,Struct,Static,Initialization,Rust,我已经通读了这本书的前半部分以及第一版。我仍然不知道如何初始化静态变量 最后,我希望有一个包含所有数字字符的函数localstaticHashSet 尝试1: fn is_digit(c: char) -> bool { static set: std::collections::HashSet<char> = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0'] .iter()

我已经通读了这本书的前半部分以及第一版。我仍然不知道如何初始化静态变量

最后,我希望有一个包含所有数字字符的函数localstatic
HashSet

尝试1:

fn is_digit(c: char) -> bool {
    static set: std::collections::HashSet<char> =
        ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0']
            .iter()
            .cloned()
            .collect();

    return set.contains(&c);
}
尝试2:(无数据,仅构造)

static set:std::collections::HashSet=std::collections::HashSet::new();
编译器生成:

error[E0015]:静态中的调用仅限于struct和enum构造函数
-->src/main.rs:1:47
|
1 |静态集:std::collections::HashSet=std::collections::HashSet::new();
|                                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
另一方面,这是可行的:

let set: std::collections::HashSet<char> = std::collections::HashSet::new();
let set:std::collections::HashSet=std::collections::HashSet::new();
HashSet
是一个
struct

这就是为什么我不理解尝试2的错误。我试图调用结构的构造函数,编译器说我只能调用结构或枚举的构造函数


我猜
new()
毕竟不是构造函数调用…?

要像在其他语言(例如C++)中一样使用
静态变量,可以使用。它进行惰性初始化来模拟这种行为

但在我看来,在你的例子中,这样一个特性是过分的。您可以简单地执行以下操作:

fn is_digit(c: char) -> bool {
    match c {
        '0'...'9' => true,
        _ => false,
    }
}

fn main() {
    assert_eq!(is_digit('0'), true);
    assert_eq!(is_digit('5'), true);
    assert_eq!(is_digit('9'), true);
    assert_eq!(is_digit('a'), false);
}
或者更好,使用标准:

fn is_digit(c: char) -> bool {
    c.is_digit(10)
}

关于struct,您是对的:strust中不存在构造函数。编译器介绍了与其他对象语言中的构造函数不同的枚举构造函数。如果你想了解更多信息,最好是继续阅读本书。

相关:和@Boiethios这些是(更)方便的初始化
HashSet
s的方法,对吗?但我相信,它们并不能解决静态问题……这与“全局”单例相同,只是将其放在关心它的函数中。我将对
匹配
哈希集
的时间复杂度进行基准测试,并查看惰性板条箱。@NoelWidmer:除非优化器真的、真的、好,我希望
match
能够轻而易举地击败
HashSet
<代码>匹配
将编译为一对CPU指令(这只是一个范围检查),而另一个则需要(1)计算哈希,(2)使用一些冲突处理逻辑进行表查找,(3)在跟踪一些指针时。。。即使您设法在编译时初始化了
HashSet
,我仍然不希望优化器能够捕获
match
性能。
fn is_digit(c: char) -> bool {
    c.is_digit(10)
}