gpt4 book ai didi

rust - 如何使用在 main 中创建的变量调用需要“静态生命周期”的函数?

转载 作者:行者123 更新时间:2023-11-29 07:57:22 26 4
gpt4 key购买 nike

我定义了一个结构,它有一个定义静态生命周期的函数:

impl MyStruct {
pub fn doSomething(&'static self) {
// Some code goes here
}
}

我像这样从 main 消费它:

fn main() {
let obj = MyStruct {};
obj.doSomething();
}

它旨在让 doSomething 调用在应用程序的生命周期内阻塞和执行。

我遇到了生命周期检查的问题,它声明它可能比 main 函数长寿,这对我来说很奇怪,因为一旦 main 完成了应用程序应该退出。

有什么办法可以实现吗?

最佳答案

创建具有'static 生命周期的引用的主要方法是使变量static。静态变量是可以在编译时创建的变量:

struct MyStruct;

impl MyStruct {
pub fn do_something(&'static self) {}
}

static OBJ: MyStruct = MyStruct;

fn main() {
OBJ.do_something();
}

随着 Rust 的持续求值故事的改进,这将更加普遍,但它永远不允许在运行时进行配置。

一个不太常见的方法是故意泄漏内存,产生一个将“永远”持续的引用。不应该这样做,因为内存泄漏不是一件好事:

fn main() {
let obj = Box::leak(Box::new(MyStruct));
obj.do_something();
}

还有创建单例的可能性:

as once main is complete the application should exit.

也许吧,但是编译器不会为了生命周期的目的而特别对待 main


hyper requires a static runtime when running the server and processing each request.

不,它没有。它有一个 : 'static 的界限,这意味着传入的任何引用都必须是 'static,但你根本不必传入一个裸引用。

对于这样的模式,最常见的是传递类似 Arc 的内容。 .这允许共享底层资源。

pub fn do_something<F, T>(f: F)
where
F: Fn() -> T + 'static,
T: 'static,
{
// "spawn" 3 threads
f();
f();
f();
}

struct MyStruct;

static OBJ: MyStruct = MyStruct;

fn main() {
// OK
do_something(|| &OBJ);

// Not OK
let another = MyStruct;
do_something(|| &another);

// OK
use std::sync::Arc;
let shared = Arc::new(MyStruct);
do_something(move || shared.clone());
}

您甚至可以使用 interior mutability如果您想要动态重新配置。

另见:

关于rust - 如何使用在 main 中创建的变量调用需要“静态生命周期”的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50740632/

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