ownership 相关问题

所有权是Rust的核心概念。所有权系统是编译器在编译时检查以管理内存的一组规则。

为相同特征的特征对象使用 move 方法来实现特征

根据下面的内容,我试图在具有相同特征的盒装特征对象上实现一个特征。我之前已经为特质做过这件事,其方法采用 &self ,效果很好,但不是 self。 // 紫色...

回答 1 投票 0

如何指示 rust 将值移动到另一个范围?

以下代码无法编译,因为编译器认为 s 保留在 main 范围内,而不是移入 spawn 范围。为什么编译器不明白 s 不需要...

回答 1 投票 0

在 Rust 中处理大型可变结构的最佳方法是什么?

这是我的问题的简化视图: 结构游戏{ 当前玩家:u8, 玩家:Vec, 单位:Vec, } fn update(游戏: &mut 游戏) { 对于游戏中的单位.u...

回答 1 投票 0

如何将 impl Trait 传递给线程

我试图将处理程序传递给每个传入请求的线程,我尝试将其包装在 Arc 中,但出现以下错误: 参数类型 impl ConnectionHandler 可能无法存活...

回答 1 投票 0

可变引用有移动语义吗?

fn main() { 让 mut name = String::from("Charlie"); 让 x = &mut 名称; 设 y = x; // x 已移动 说你好(y); 说你好(y); // 但 y 还没有...

回答 1 投票 0

需要更多解释 Rust 中所有权上下文中的 Scope 和 Drop 调用的行为

我是 Rust 的新手,对了解它的所有权概念更加好奇。根据官方文档,关于引用的概念提到了以下内容: 这就是你的方法

回答 1 投票 0

Rust 从可变引用中重新借用共享引用

我是 Rust 新手,并试图理解为什么对已借用元素的数据结构的可变引用似乎可以在同一生命周期内再次使用来借用另一个元素...

回答 1 投票 0

这个例子颠覆了我对所有权和引用范围的理解

//打印: // 字符串-a // 字符串-aaabc fn 主() { 让 mut a = String::from("string-"); 让 s = &mut a; 让 ss = &mut a; // s 超出了这里的范围 SS....

回答 2 投票 0

Rust:这个例子颠覆了我对所有权和引用范围的理解。我很困惑

//打印: // 字符串-a // 字符串-aaabc fn 主() { 让 mut a = String::from("string-"); 让 s = &mut a; 让 ss = &mut a; // s 超出了这里的范围 SS....

回答 1 投票 0

如何返回对当前函数拥有的值的可变引用

这是我的结构,我需要一个 get_mut 函数,它返回对以下任一者拥有的值的可变引用 递归地 ctx.scope 或 ctx.parent.scope 酒吧类型 RuntimeContext<'c> = Rc 这是我的结构,我需要一个 get_mut 函数,它返回对以下任一者拥有的值的可变引用 ctx.scope 或 ctx.parent.scope 递归 pub type RuntimeContext<'c> = Rc<RefCell<Context<'c>>>; pub struct Context<'c> { pub parent: Option<RuntimeContext<'c>>, pub scope: HashMap<String, Value>, pub eval: Value, } 这是我尝试过的,但正如预期的那样,借用检查器抱怨cannot return reference to temporary value returns a reference to data owned by the current function,还有什么其他方法可以实现此目的? (保证父ctx勾画出当前ctx) impl<'c> Context<'c> { pub fn get_mut(&mut self, key: &str) -> Option<&mut Value> { if let Some(v) = self.scope.get_mut(key) { Some(v) } else if let Some(parent) = &mut self.parent { parent.borrow_mut().get_mut(key) // here it breaks } else { None } } // ... some other methods } 你不能;根本没有办法返回对包装在 &mut 中的对象成员的 Rc<RefCel<>> 引用。 RefCell 需要一个守卫对象来跟踪该对象当前是否被借用。然而,&mut 引用不会做这样的事情,使得 RefCell 无法知道 &mut 引用在其保护解除后是否存在。这发生在函数末尾。 通常,可以返回仍包含防护对象的内容,但这当然与您想要从 scope 成员返回引用的其他返回路径不兼容。 我可以想到两种方法来实现这一目标: 可以返回引用或保护对象的枚举返回值 类似于基于闭包的方法的上下文管理器,您不返回任何内容,而是使用您的值调用给定的函数 枚举的返回值很难正确获取,并且由于变量的多层深度嵌套,会变得非常复杂。 所以我个人会选择第二种选择。 这可能是这样的: use std::{cell::RefCell, collections::HashMap, rc::Rc}; #[derive(Debug)] pub struct Value; pub type RuntimeContext<'c> = Rc<RefCell<Context<'c>>>; pub struct Context<'c> { pub parent: Option<RuntimeContext<'c>>, pub scope: HashMap<String, Value>, pub eval: Value, } impl<'c> Context<'c> { pub fn get_mut<R>(&mut self, key: &str, f: impl FnOnce(Option<&Value>) -> R) -> R { if let Some(v) = self.scope.get_mut(key) { f(Some(v)) } else if let Some(parent) = &mut self.parent { parent.borrow_mut().get_mut(key, f) // here it breaks } else { f(None) } } // ... some other methods } // Example on how to use this pub fn do_something(context: &mut Context) { let y = context.get_mut("foobarkey", |value| { println!("Got value: {:?}", value); let computed_result = 42; computed_result }); println!("Result: {}", y); }

回答 1 投票 0

使用 Azure Devops 的组织的所有者处于非活动状态 - 如何将活动用户指定为所有者?

我们将 Azure 与 3 个不同的组织一起使用,并在多个团队中分别创建了 1 个项目 第一个组织只有一个所有者,此人现在在我们公司不活跃,然后......

回答 1 投票 0

地图没有副作用?在插入时获取所有权(而不是可变引用)的映射?

Rust 中是否有一种数据结构具有以下类型的函数签名? 实现 地图 { fn insert(self, 键: K, 值: V) -> Self } 即它不需要...

回答 1 投票 0

如何迭代存储在结构中的字符串向量而不移动它们?

我有一个大型结构,其中包含一个字符串向量作为成员。我试图迭代这些并将每个传递给另一个采用 &str 参数的方法。后一种方法需要 &mut

回答 1 投票 0

Rust:没有副作用的地图?在插入时获取所有权(而不是可变引用)的映射?

Rust 中是否有一种数据结构具有以下类型的函数签名? 实现 地图 { fn insert(self, 键: K, 值: V) -> Self } 即它不需要...

回答 1 投票 0

在`match`声明中使用时将变量重新绑定到不同的类型

我正在使用 typestate 模式编写 Rust 代码来为其创建 API 和 CLI。 我有一个 struct VendingMachine,其中 S 是代表我当前状态的 ZST(例如 VendingMachine 我正在使用 typestate 模式编写 Rust 代码来为其创建 API 和 CLI。 我有一个结构体VendingMachine<S>,其中S是代表我当前状态的ZST(例如VendingMachine<Start>,VendingMachine<Payment>,VendingMachine<Checkout>等) 我想让我的自动售货机循环运行并将每个状态与某些代码相匹配: let mut machine = VendingMachine::new::<Start>(/*...*/); loop { match machine.state { Start => {/* do something and then change the type of `machine` to VendingMachine<Payment> using some transitioning method */}, Payment => {/* do something else and then change the type of `machine` to VendingMachine<Checkout> using some other transitioning method */}, ... } } 但是,编译器会拒绝此代码 - 如果我将匹配手臂中的“machine”重新绑定到如下转换的结果: let machine = machine.to_payment(); 其中 .to_payment() 有此签名: fn to_payment(self) -> VendingMachine<Payment> 然后我收到“使用移动值:`machine.state`”错误,因为“在之前的循环迭代中,由于此 [to_ payment()] 方法调用,`machine` 发生了移动” 如何实现我需要的行为? 没有办法改变绑定的类型,这在 Rust 中是不可能的,因为编译后所有类型都会被忘记,如果类型完全不同,那么你就无法区分 VendingMachine<Start> 和 VendingMachine<Payment>。为了能够将它们分开,您必须使用可以在运行时区分的东西,例如枚举。

回答 1 投票 0

从 rust 函数返回 &HashMap

我正在努力寻找一种优雅的解决方案来访问 Rust 中的嵌套映射以实现只读目的。我遇到了这种情况,理想情况下,我可以返回对空 m 的引用...

回答 0 投票 0

为什么不可变特征的实现可以是可变的?

这是我的代码,可以编译 特征 AppendBar { fn append_bar(self) -> 自我; } impl AppendBar for Vec { fn append_bar(mut self) -> 自我 { self.push("酒吧&...

回答 1 投票 0

我无法理解 Rust 中的所有权 [关闭]

我是 Rust 的绝对初学者(英语很差),我在所有权的概念上遇到了一些麻烦,并阅读了“Programming Rust - Fast, Safe

回答 2 投票 0

当不可变引用可以完成这项工作时,为什么我们需要 Rc<T>?

为了说明 Rc 的必要性,本书提供了以下代码片段(剧透:它不会编译)以表明我们不能在没有 Rc 的情况下启用多重所有权。 枚举列表 { ...

回答 3 投票 0

如何在 Rust 中通过指针返回值

我无法理解如何创建一个字符串,我可以在不违反生命周期的情况下“返回”给调用者。 我有一个简单的类型函数 pub extern fn get_string(文件: &am...

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.