gpt4 book ai didi

rust - 如何在 Rust 中为应用程序上下文创建句柄?

转载 作者:行者123 更新时间:2023-11-29 08:33:23 27 4
gpt4 key购买 nike

这是一个更高层次的问题,但是我不确定应该使用 Rust 的哪些特性来细化这个问题。

编写具有工具 API 的图形应用程序的第一步,我们可能希望传入一个context 参数,它公开了应用程序的各个部分:

// Where the data lives.
struct Application {
preferences: Preferences,
windows: Vec<Windows>,
documents: Vec<Document>,
}

// A view on the data to pass to tool-code.
struct AppContext {
preferences: &Preferences, // immutable
window: &Window, // immutable
doc: &Document, // mutable
// ... real world use case has more vars ...
}

// example use
fn some_tool_uppercase(context: &mut AppContext, options: &ToolOptions) {
// random example
for w in context.document.words {
w.to_uppercase();
}
context.window.redraw_tag();
}

写这篇文章时,我遇到了借用检查器的问题,因为文档也存储在其他文档的列表中 - 导致它同时在两个地方可变。

只是为了编译我的程序,目前我正在从列表中删除文档,运行该工具,然后在工具完成后将其添加回文档列表。

虽然在某些情况下可以传递多个参数,但上面的示例已被简化。将上下文的每个成员作为参数传递是不切实际的。

应如何将应用程序的上下文包装到可以传递到工具代码中的类型中,而不会引起借用检查器的复杂性?

最佳答案

& 用于临时借用数据给函数。通常当您需要从代码中的多个位置访问数据时,您将需要 RcArc 类型。

此外,您可能希望数据具有内部可变性。在这种情况下,您还需要将其包装在 CellRefCell 中。

如果您的数据在线程之间共享,您还需要用 MutexRwLock 包装它。

现在,根据您的用例,您需要将所有这些组合到您的数据结构中。更多信息请阅读:rust wrapper type composition

您的示例可能如下所示:

// Where the data lives.
struct Application {
preferences: Rc<Preferences>,
windows: Rc<Vec<Windows>>,
document: Rc<RefCell<Vec<Document>>>,
}

// A view on the data to pass to tool-code.
struct AppContext {
preferences: Rc<Preferences>, // immutable
window: Rc<Window>, // immutable
document: Rc<RefCell<Document>>, // mutable
// ... real world use case has more vars ...
}

// example use
fn some_tool_uppercase(context: &mut AppContext, options: &ToolOptions) {
// random example
for w in (*context.document.borrow_mut()).words {
w.to_uppercase();
}
context.window.redraw_tag();
}

或者如果它是多线程的:

struct Application {
preferences: Arc<RwLock<Preferences>>,
windows: Arc<Mutex<Vec<Windows>>>,
document: Arc<Mutex<Vec<Document>>,
}
....

关于rust - 如何在 Rust 中为应用程序上下文创建句柄?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41029772/

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