< 返回版块

kaixinbaba 发表于 2022-05-15 11:28

Tags:static,once

我想实现一个命令行的工具,命令行上支持用户传入参数,在程序启动之后,通过判断这个参数来初始化一个全局的静态变量(是一个自定义的结构体),程序其他地方直接使用(可保证只读)该变量即可


pub static GLOBAL_STRUCT: MyStruct = MyStruct::default();

#[derive(Default)]
struct MyStruct {
    name: String,
}



fn main() {
    let num = 0; // 假设这个 num 是用户输入的(来自命令行参数)
   
    // 如何修改全局的静态变量,我能保证除了这里,其他地方不会再修改
    if num == 0 {
        GLOBAL_STRUCT = ...;
    } else {
        GLOBAL_STRUCT = ...;
    }

}

差不多我需求的最小代码是这样,求助各位大佬。。。帮帮小弟,应该如何修改(使用生态中的哪些工具)

评论区

写评论
Aya0wind 2022-05-17 11:51

你可以封装一个函数,用函数来读,unsafe只要你能保证是safe的,那就可以把他封装成safe用,前提是你确实能保证。

pub static mut DATA: MyStruct = MyStruct { member: 0 };

fn getDataInstance() -> &'static MyStruct {
    unsafe { &DATA }
}

--
👇
Neutron3529: 可是static mut会导致使用全局变量时必须unsafe

漫天unsafe读一个常量,总觉得不应该是正解。

--
👇
Aya0wind: 既然就一次初始化,而且以后都不改,那也不建议你用什么lazystatic,什么xxcell了,直接unsafe改就完了。

struct MyStruct{
    member:i32,
}

static mut DATA:MyStruct = MyStruct{ member:0 };

fn main() {
    let mut s = Default::default();
    stdin().read_line(&mut s).unwrap();
    unsafe{
        DATA.member=s.trim().parse().unwrap();
    }
}
Neutron3529 2022-05-16 13:49

可是static mut会导致使用全局变量时必须unsafe

漫天unsafe读一个常量,总觉得不应该是正解。

--
👇
Aya0wind: 既然就一次初始化,而且以后都不改,那也不建议你用什么lazystatic,什么xxcell了,直接unsafe改就完了。

struct MyStruct{
    member:i32,
}

static mut DATA:MyStruct = MyStruct{ member:0 };

fn main() {
    let mut s = Default::default();
    stdin().read_line(&mut s).unwrap();
    unsafe{
        DATA.member=s.trim().parse().unwrap();
    }
}
Aya0wind 2022-05-15 11:34

既然就一次初始化,而且以后都不改,那也不建议你用什么lazystatic,什么xxcell了,直接unsafe改就完了。

struct MyStruct{
    member:i32,
}

static mut DATA:MyStruct = MyStruct{ member:0 };

fn main() {
    let mut s = Default::default();
    stdin().read_line(&mut s).unwrap();
    unsafe{
        DATA.member=s.trim().parse().unwrap();
    }
}
eweca-d 2022-05-15 11:31

once_cell = "1.10.0"

1 共 4 条评论, 1 页