所有权是Rust的核心概念。所有权系统是编译器在编译时检查以管理内存的一组规则。
为什么我可以从 Vec 而不是从数组创建值的迭代器? [重复]
下面的代码可以编译,但是如果传递给函数 f 的参数从字符串向量更改为字符串数组,则它不会编译。我试图理解为什么。我认为这有什么关系
// https://cses.fi/problemset/task/1621 使用 std::collections::HashSet; fn 主() { 让 mut inp: String = String::new(); std::io::stdin() .read_line(&am...
// https://cses.fi/problemset/task/1621 使用 std::collections::HashSet; fn 主() { 让 mut inp: String = String::new(); std::io::stdin() .read_line(&am...
如果主函数结束时整个过程也结束,那么闭包怎么会比主函数活得更久呢?
我有以下代码: 使用 std:: 线程; fn 主() { 让 x: &'static mut [i32; 3] = Box::leak(Box::new([1, 2, 3])); 线程::spawn(|| dbg!(&x)); } 当我编译它时,出现以下错误: ...
根据下面的内容,我试图在具有相同特征的盒装特征对象上实现一个特征。我之前已经为特质做过这件事,其方法采用 &self ,效果很好,但不是 self。 // 紫色...
以下代码无法编译,因为编译器认为 s 保留在 main 范围内,而不是移入 spawn 范围。为什么编译器不明白 s 不需要...
这是我的问题的简化视图: 结构游戏{ 当前玩家:u8, 玩家:Vec, 单位:Vec, } fn update(游戏: &mut 游戏) { 对于游戏中的单位.u...
我试图将处理程序传递给每个传入请求的线程,我尝试将其包装在 Arc 中,但出现以下错误: 参数类型 impl ConnectionHandler 可能无法存活...
fn main() { 让 mut name = String::from("Charlie"); 让 x = &mut 名称; 设 y = x; // x 已移动 说你好(y); 说你好(y); // 但 y 还没有...
需要更多解释 Rust 中所有权上下文中的 Scope 和 Drop 调用的行为
我是 Rust 的新手,对了解它的所有权概念更加好奇。根据官方文档,关于引用的概念提到了以下内容: 这就是你的方法
我是 Rust 新手,并试图理解为什么对已借用元素的数据结构的可变引用似乎可以在同一生命周期内再次使用来借用另一个元素...
//打印: // 字符串-a // 字符串-aaabc fn 主() { 让 mut a = String::from("string-"); 让 s = &mut a; 让 ss = &mut a; // s 超出了这里的范围 SS....
Rust:这个例子颠覆了我对所有权和引用范围的理解。我很困惑
//打印: // 字符串-a // 字符串-aaabc fn 主() { 让 mut a = String::from("string-"); 让 s = &mut a; 让 ss = &mut a; // s 超出了这里的范围 SS....
这是我的结构,我需要一个 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); }
使用 Azure Devops 的组织的所有者处于非活动状态 - 如何将活动用户指定为所有者?
我们将 Azure 与 3 个不同的组织一起使用,并在多个团队中分别创建了 1 个项目 第一个组织只有一个所有者,此人现在在我们公司不活跃,然后......
地图没有副作用?在插入时获取所有权(而不是可变引用)的映射?
Rust 中是否有一种数据结构具有以下类型的函数签名? 实现 地图 { fn insert(self, 键: K, 值: V) -> Self } 即它不需要...
我有一个大型结构,其中包含一个字符串向量作为成员。我试图迭代这些并将每个传递给另一个采用 &str 参数的方法。后一种方法需要 &mut
Rust:没有副作用的地图?在插入时获取所有权(而不是可变引用)的映射?
Rust 中是否有一种数据结构具有以下类型的函数签名? 实现 地图 { fn insert(self, 键: K, 值: V) -> Self } 即它不需要...
我正在使用 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>。为了能够将它们分开,您必须使用可以在运行时区分的东西,例如枚举。
我正在努力寻找一种优雅的解决方案来访问 Rust 中的嵌套映射以实现只读目的。我遇到了这种情况,理想情况下,我可以返回对空 m 的引用...