gpt4 book ai didi

Rust 生命周期 : Static reference lives to short to be fed into a function?

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

我发现了 rust 并且很难处理生命周期。

例如,我正在对 GUI 进行一些试验:

#[macro_use]extern crate native_windows_gui as nwg;

use nwg::{Ui, Event, EventArgs};

nwg_template!(
head: setup_ui<&'static str>,
controls: [
("MainWindow", nwg_window!(title="Test1"; size=(180,50))),
("SetButton", nwg_button!(parent="MainWindow"; visible=false)),
("BackButton", nwg_button!(parent="MainWindow"; text="<"; position=(10,10); size=(30,30))),
("Text", nwg_textbox!(parent="MainWindow"; readonly=true; position=(40,10); size=(100,30))),
("NextButton", nwg_button!(parent="MainWindow"; text=">"; position=(140,10); size=(30,30)))
];
events: [
("SetButton", "Set", Event::Click, |app,_,_,_| {
let display = nwg_get_mut!(app; ("Text", nwg::TextBox));
let index = nwg_get!(app; ("Index", &str));
display.set_text(**index);
}),
("BackButton", "Back", Event::Click, |_,_,_,_| {}),
("NextButton", "Next", Event::Click, |_,_,_,_| {})
];
resources: [];
values: [
("Index", "Test")
]
);

fn create_ui(data: &'static str) -> Result<Ui<&'static str>, nwg::Error> {
let app: Ui<&'static str>;

match Ui::new() {
Ok(ui) => { app = ui; },
Err(e) => { return Err(e) }
}

if let Err(e) = setup_ui(&app) {
return Err(e);
}

app.pack_value(&"Data", &data);
app.trigger(&"SetButton", Event::Click, EventArgs::None);

if let Err(e) =app.commit() {
Err(e)
} else {
Ok(app)
}
}

fn main() {
let data = "Foo";
let _ui = create_ui(data).expect("Oups");
nwg::dispatch_events();
}

我不明白为什么在函数 create_ui 中,data 没有足够长的时间被送入 app.pack_value().

在我看来,'static 生命周期可以让它存活足够长的时间。

但编译器坚持认为它在 create_ui 结束时死亡,因此不能用作 app.pack_value("Data", &data);

我做错了什么?

最佳答案

在不知道确切错误的情况下,很难确定,但我的猜测是:

fn create_ui(data: &'static str) -> Result<Ui<&'static str>, nwg::Error>

参数data会借用一串静态生命周期。也就是说,它指向的东西(字符串数据)具有静态生命周期,但引用本身具有函数的生命周期。现在让我们看看 native_windows_gui crate 中的函数:

fn pack_value<T: Into<Box<T>> + 'static>(&self, id: &ID, value: T)

参数 value 必须具有静态生命周期。还有一些其他要求,但它们不相关。现在回到您的代码:

app.pack_value(&"Data", &data);

您正在传递 pack_value data 的引用,这已经是一个引用。也就是说,您传递的参数的类型为 &&'static str。外部引用(您传递的引用)没有静态生命周期:它的生命周期与您的函数一样长。

C++ 中的等价物是这样的

result_type create_ui(static char *str) {
Ui app = ...;
app.pack_value(&"Data", &str);
}

这在 C++ 中编译得很好,但您传递的不是字符串,而是参数的地址。这可以正常编译,但行为是未定义的,并且它取决于取消引用该指针时堆栈上的其他内容。在 Rust 中,编译器会告诉您哪里出了问题,而不是一个难以调试的问题。

解决方案与 C++ 相同:您需要删除多余的 &,并传递您收到的相同引用:

app.pack_value(&"Data", data);

关于Rust 生命周期 : Static reference lives to short to be fed into a function?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48893006/

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