gpt4 book ai didi

rust - 如何在构造函数中调用结构体方法?

转载 作者:行者123 更新时间:2023-12-04 12:33:20 31 4
gpt4 key购买 nike

我对 Rust 比较陌生,并且遇到了如何用另一种语言编写构造函数的特殊性。我有一个结构体,S3Logger ,它会在磁盘上创建一个临时文件,当有一定数量的数据写入此文件时,将上传到 S3 并旋转到另一个文件。
我要我的 new在类上使用方法的函数,gen_new_file ,这将在写入位置打开一个具有正确名称的新文件。然而,为了使它成为一种方法,我必须已经有一个 S3Logger传递,我在 new 期间还没有功能。在下面的示例中,我展示了如何用另一种语言执行此操作,在使用对象方法完成构造之前部分构造对象;但是这显然在 Rust 中不起作用。
我可以使用 Optioncurrent_log_file ,但这感觉有点恶心。如果我有 S3Logger,我想强制执行不变量,我知道它有一个打开的文件。
对于此类问题,Rust 的最佳实践是什么?

pub struct S3Logger {
local_folder: PathBuf,
destination_path: String,
max_log_size: usize,

current_log_file: File,
current_logged_data: usize
}

impl S3Logger {
pub fn new<P: AsRef<Path>>(
local_folder: P,
destination_path: &str,
max_log_size: usize
) -> Self {
std::fs::create_dir_all(&local_folder).unwrap();

let mut ret = Self {
local_folder: local_folder.as_ref().to_path_buf(),
destination_path: destination_path.to_string(),
max_log_size: max_log_size,
current_logged_data: 0
};
// fails ^^^^ missing `current_log_file

ret.gen_new_file();
return ret
}

fn gen_new_file(&mut self) -> () {
let time = Utc::now().to_rfc3339();
let file_name = format!("{}.log", time);
let file_path = self.local_folder.join(file_name);
self.current_log_file = File::create(&file_path).unwrap();
}
}

最佳答案

最简单的方法是制作 gen_new_filelocal_folder: P而不是 &mut self , 返回 File从那里并在构造函数中调用它:

use std::fs::File;
use std::path::{Path, PathBuf};
use chrono::Utc;

pub struct S3Logger {
local_folder: PathBuf,
destination_path: String,
max_log_size: usize,

current_log_file: File,
current_logged_data: usize
}

impl S3Logger {
pub fn new<P: AsRef<Path>>(
local_folder: P,
destination_path: &str,
max_log_size: usize
) -> Self {
std::fs::create_dir_all(&local_folder).unwrap();
let current_log_file = Self::gen_new_file(&local_folder);
Self {
local_folder: local_folder.as_ref().to_path_buf(),
destination_path: destination_path.to_string(),
max_log_size: max_log_size,
current_logged_data: 0,
current_log_file,
}
}

fn gen_new_file<P: AsRef<Path>>(local_folder: P) -> File {
let time = Utc::now().to_rfc3339();
let file_name = format!("{}.log", time);
let file_path = local_folder.as_ref().join(file_name);
File::create(&file_path).unwrap()
}
}
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=ee447eabc799035e8db246d3bccb225b
如果需要更换 current_log_file稍后,您可以使用相同的方法:
fn replace_log_file<P: AsRef<Path>>(&mut self, new_path: P) {
let new_file = Self::gen_new_file(&new_path);
self.current_log_file = new_file;
}

关于rust - 如何在构造函数中调用结构体方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66839186/

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