gpt4 book ai didi

rust - 为什么对 const 变量的更改不会在两次使用之间持续存在?

转载 作者:行者123 更新时间:2023-11-29 08:20:26 25 4
gpt4 key购买 nike

我正在尝试创建一个结构来操作文件存储,但在我更改值后它无法使用。我确定这与生命周期有关,但我不明白如何解决这个问题。

use std::error::Error;
use std::fs::{File, OpenOptions};
use std::io::{BufRead, BufReader};
use std::option::Option;
use std::path::Path;

pub struct Storage<'a> {
path_str: &'a str,
file: Option<File>,
}

const LOCKED_STORAGE: Storage<'static> = Storage {
path_str: &"/tmp/bmoneytmp.bms",
file: None,
};

pub fn get_instance() -> Storage<'static> {
if LOCKED_STORAGE.file.is_none() {
LOCKED_STORAGE.init();
}

LOCKED_STORAGE
}

impl Storage<'static> {
// Create a file for store all data, if does not alred exists
fn init(&mut self) {
let path = Path::new(self.path_str);

self.file = match OpenOptions::new()
.read(true)
.write(true)
.create(true)
.open(path)
{
Err(e) => panic!("Couldn't create the storage file at {}", e.description()),
Ok(file) => Some(file),
};

if self.file.is_none() {
panic!("Error on init??"); // This line is not called. Ok :)
}
}

// Check if section exists
pub fn check_section(&self, name: String) -> bool {
if self.file.is_none() {
panic!("Error on check??"); // This line is called. :(
}
true
}
}

fn main() {
let storage = get_instance();
storage.check_section("accounts".to_string());
}

playground

这失败了:

thread 'main' panicked at 'Error on check??', src/main.rs:48:13

我正在尝试使用一种方法打开一个文件并读取这个打开的文件,但是在第二种方法中,文件的实例没有打开。使用 Option<File> ,我用 Same 更改值/None但变量仍然是 None .

最佳答案

在编程时,学习如何创建 Minimal, Complete, and Verifiable example 是一项非常重要的技能。 .这是您的问题之一:

const EXAMPLE: Option<i32> = Some(42);

fn main() {
EXAMPLE.take();
println!("{:?}", EXAMPLE);
}

这会打印 Some(42)EXAMPLE 的值没有改变。

const 变量不能保证它有多少个实例。允许编译器拥有它的零个、一个或多个实例。每次你使用 const 时,就好像你在那里创建了一个全新的值,粘贴在常量的定义中:

fn main() {
Some(42).take();
println!("{:?}", Some(42));
}

相反,您想要 create a singleton .

另见:

关于rust - 为什么对 const 变量的更改不会在两次使用之间持续存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52469986/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com