如何在Rust中声明一个"static"结构体字段?

58

如何在Rust中声明一个"静态"结构体字段,最好带有默认值:

struct MyStruct {
    x: i32,               // instance
    y: i32,               // instance
    my_static: i32 = 123, // static, how?
}

fn main() {
    let a = get_value();
    if a == MyStruct::my_static {
        //...
    } else {
        //...
    }
}

使用static关键字不起作用吗? - CinCout
3个回答

105

您可以在 impl 中声明关联常量:

struct MyStruct {
    x: i32,
    y: i32,
}

impl MyStruct {
    const MY_STATIC: i32 = 123;
}

fn main() {
    println!("MyStruct::MY_STATIC = {}", MyStruct::MY_STATIC);
}

5
在Rust中,“static”和“const”是不同的东西。 - Shepmaster
18
@Shepmaster,我知道。我认为问题的作者所想的不是Rust中的静态变量,而是结构体的成员,这些成员没有存储在结构体对象中。 - aitvann
5
以下是 "Rust 中的常量和静态变量" 网页的链接,可了解 Rust 中不同的概念:https://doc.rust-lang.org/book/const-and-static.html。 - Kristianmitk
1
这恰好符合我的使用情况,即“Python类常量属性”。 - MisterMiyagi
1
这应该是被接受的答案,因为它做到了 OP 想要的。 - SharedRory
显示剩余2条评论

22

Rust不支持结构体中的静态字段,因此您不能这样做。您能得到的最接近的东西是一个关联方法:

struct MyStruct {
    x: i32,
    y: i32,
}

impl MyStruct {
    #[inline]
    pub fn my_static() -> i32 {
        123
    }
}

fn main() {
    let a = get_value();
    if a == MyStruct::my_static() {
        //...
    } else {
        //...    
    }
}

3
你知道为什么不行吗? - Incerteza
12
@AlexanderSupertramp,可能是因为它们并不是真正需要的吗?静态字段只能用于作用域和封装,但是在 Rust 中,封装单元是模块,所以只需在您的结构体所在的模块中创建一个 static ,就可以了。 - Vladimir Matveev

13

在结构体中无法声明静态字段。

你可以像这样在模块范围内声明静态变量:

static FOO: int = 42;

如果没有使用不安全代码,你是不能将静态变量设置为可变的:为了遵循借用规则,它必须被包裹在一个容器中,进行运行时借用检查,并且是Sync类型,例如MutexRWLock,但是这些类型由于具有非平凡的构造函数,所以无法存储在静态变量中。


1
如果您想使用Mutex使静态变量可变,可以将其与lazy-static!结合使用(它还会进行额外的包装)。 - jkmartindale
@Levans,如果结构体被声明为静态的,那么它会应用于其成员吗? - user2284570

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接