Struct 检测新结构初始化

Struct 检测新结构初始化,struct,rust,rust-cargo,Struct,Rust,Rust Cargo,我主要来自OOP语言,所以让这个概念在Rust中工作似乎有点困难。我想实现一个基本计数器,它记录我对该类型创建的“实例”的数量,并将它们保存在一个向量中供以后使用 我尝试过很多不同的方法,首先是制作一个静态向量变量,但这不能做到,因为它不允许有析构函数的静态内容 这是我第一次尝试: struct Entity { name: String, } struct EntityCounter { count: i64, } impl Entity { pub fn init

我主要来自OOP语言,所以让这个概念在Rust中工作似乎有点困难。我想实现一个基本计数器,它记录我对该类型创建的“实例”的数量,并将它们保存在一个向量中供以后使用

我尝试过很多不同的方法,首先是制作一个静态向量变量,但这不能做到,因为它不允许有析构函数的静态内容

这是我第一次尝试:

struct Entity {
    name: String,
}

struct EntityCounter {
    count: i64,
}

impl Entity {
    pub fn init() {
        let counter = EntityCounter { count: 0 };
    }

    pub fn new(name: String) {
        println!("Entity named {} was made.", name);
        counter += 1; // counter variable unaccessable (is there a way to make it global to the struct (?..idek))
    }
}

fn main() {
    Entity::init();
    Entity::new("Hello".to_string());
}
第二:

struct Entity {
    name: String,
    counter: i32,
}

impl Entity {
    pub fn new(self) {
        println!("Entity named {} was made.", self.name);
        self.counter = self.counter + 1;
    }
}

fn main() {
    Entity::new(Entity { name: "Test".to_string() });
}

这些都不管用,我只是在尝试一些如何实现这样一个功能的概念。

您的问题似乎比您描述的更基本。你把代码扔到墙上,看看是什么粘住了你,这根本不会让你有任何进展。我建议在继续之前完全阅读。如果你不了解其中的某些内容,可以询问。目前,您正在演示您不了解变量作用域、返回类型、实例构造如何工作、静态如何工作以及参数如何传递。这是一个非常不稳定的基础,无法建立任何理解

在这种特殊情况下,你要求的是故意不直接的东西。你说你想要一个计数器和一个实例向量。计数器很简单,但是实例向量?Rust不允许像其他语言一样轻松共享,因此如何进行共享在很大程度上取决于您实际打算使用它的目的

下面是一个非常粗略的猜测,大概和你想要的东西有点相似

/*!
因为我们需要‘lazy_static’板条箱,所以您需要将以下内容添加到
`Cargo.toml`文件:
```货物
[依赖关系]
lazy_static=“0.2.1”
```
*/
#[宏使用]外部板条箱静态;
mod实体{
使用std::sync::{Arc,Weak,Mutex};
使用std::sync::atomic;
发布结构实体{
酒吧名称:String,
}
impl实体{
pub fn new(名称:String)->Arc{
println!(“创建了名为{}的实体。”,名称);
让ent=Arc::新建(实体){
姓名:姓名,,
});
bump_计数器();
记住_实例(ent.clone());
耳鼻喉科
}
}
/*
计数器很简单,虽然我不清楚你为什么想要
首先是它。你似乎没有用它做任何事。。。
*/
静态计数器:atomic::AtomicUsize=atomic::atomic_USIZE_INIT;
fn bump_计数器(){
//使用最保守的顺序添加一个。
COUNTER.fetch_add(1,原子::排序::SeqCst);
}
pub fn get_counter()->usize{
COUNTER.load(原子::排序::SeqCst)
}
/*
这部分有多种方法,但你根本没有给出答案
关于你想做什么的足够信息这充其量是,
非常粗略的猜测。
`互斥`允许我们安全地从任何线程中变异向量,并且`弱``
防止“实例”使每个实例永远保持活动状态。我的意思是,
也许你想要,但你没有具体说明。
请注意,我还没有在这里编写“清理”函数来删除死区
参考资料。
*/
懒惰的人{
静态引用实例:Mutex=Mutex::new(vec![]);
}
fn\u实例(实体:弧){
//降级到弱引用。类型约束只是为了清楚起见。
let实体:弱=弧::降级(&实体);
实例
//锁互斥
.lock().expect(“实例互斥已中毒”)
//推送实体
.推动(实体);
}
pub fn get_instances()->Vec{
/*
这和我写这篇文章的效率一样低,但同样,没有
了解你的访问模式,我真的做得再好不过了。
*/
实例
//锁互斥
.lock().expect(“实例互斥已中毒”)
//从Vec获取借用迭代器。
.国际热核实验堆(iter)
/*
将每个“弱”转换为新的“弧”。如果
无法(因为弱引用已失效),请删除该元素。
*/
.filter_映射(|弱_实体|弱_实体.upgrade())
//收集到新的“Vec”中。
.collect()
}
}
fn main(){
使用实体::实体;
设e0=Entity::new(“Entity 0.”to_string());
println!(“e0:{}”,e0.name);
{
设e1=Entity::new(“Entity 1.to_string());
println!(“e1:{}”,e1.name);
/*
`e1`被放在这里,这将导致底层的`Entity`被删除
停止存在,因为没有其他“强”引用。
*/
}
让e2=Entity::new(“Entity 2.to_string());
println!(“e2:{}”,e2.name);
println!((“计数器:{}”,entity::get_Counter());
println!(“实例:”);
对于entity::get_instances()中的ent{
println!(“-{}”,ent.name);
}
}

您的问题似乎比您描述的更为根本。你把代码扔到墙上,看看是什么粘住了你,这根本不会让你有任何进展。我建议在继续之前完全阅读。如果你不了解其中的某些内容,可以询问。目前,您正在演示您不了解变量作用域、返回类型、实例构造如何工作、静态如何工作以及参数如何传递。这是一个非常不稳定的基础,无法建立任何理解

在这种特殊情况下,你要求的是故意不直接的东西。你说你想要一个计数器和一个实例向量。计数器很简单,但是实例向量?Rust不允许像其他语言一样轻松共享,因此如何进行共享在很大程度上取决于您实际打算使用它的目的

下面是一个非常粗略的猜测,大概和你想要的东西有点相似

/