我有一个持久的编译错误,其中Rust抱怨我在尝试可变借用时有一个不可变的借位,但是不可变借用来自另一个范围,而我并没有从中带来任何东西.
我有一些代码检查地图中的值,如果它存在,则返回它,否则它需要以各种方式改变地图.问题是我似乎无法找到让Rust同时执行的方法,即使这两个操作完全分开.
这是一些荒谬的代码,它遵循与我的代码相同的结构并展示了问题:
use std::collections::BTreeMap;
fn do_stuff(map: &mut BTreeMap<i32, i32>, key: i32) -> Option<&i32> {
// extra scope in vain attempt to contain the borrow
{
// borrow immutably
if let Some(key) = map.get(&key) {
return Some(key);
}
}
// now I'm DONE with the immutable borrow, but rustc still thinks it's borrowed
map.insert(0, 0); // borrow mutably, which errors
None
}
Run Code Online (Sandbox Code Playgroud)
这出错了:
error[E0502]: cannot borrow `*map` as mutable because it is also borrowed as immutable
--> src/lib.rs:14:5
|
3 …Run Code Online (Sandbox Code Playgroud) 比方说我有一些特点:
trait MyTrait {
fn function1(&self);
}
Run Code Online (Sandbox Code Playgroud)
和一些实现它的类型:
struct MyStruct {
number: i32,
}
impl MyTrait for MyStruct {
fn function1(&self) {
printn!("{}", self.number);
}
}
Run Code Online (Sandbox Code Playgroud)
现在我有另一种类型,它想要实现的东西MyTrait.它不关心他们是否拥有.从阅读周围,这听起来像做到这一点的正确方法是把它取Borrow<X>来代替X或&X或什么的.这使得它拿样东西X,或Rc<X>或Box<X>等..
当X具体类型的时候,我有这个工作,但是当X一个特性时我该如何使它工作?
这是我先尝试过的:
struct Consumer<T> {
inner: T
}
impl<T: Borrow<MyTrait>> Consumer<T> {
pub fn new(inner: T) -> Consumer<T> {
Consumer {
inner: inner
}
}
pub fn do_stuff(&self) {
self.inner.borrow().function1();
}
}
fn main() { …Run Code Online (Sandbox Code Playgroud) 在桌面上,我可以这样做:
IStorageFile file = ...
DateTime date = ...
BasicProperties props = await file.GetBasicPropertiesAsync();
var changes = new List<KeyValuePair<string,object>>();
changes.Add(new KeyValuePair<string, object>("System.DateCreated", date));
await props.SavePropertiesAsync(changes);
Run Code Online (Sandbox Code Playgroud)
但是在WP8上,没有实现BasicProperties.SavePropertiesAsync.
还有其他方法可以做到这一点吗?
我有一个Option<String>和一个功能,需要一个Option<&str>.我认为Option::as_ref会工作,因为通常会&String自动转换为&str,但不是在这里.我收到此错误:
sandbox.rs:6:27: 6:37 error: mismatched types:
expected `core::option::Option<&str>`,
found `core::option::Option<&collections::string::String>`
(expected str,
found struct `collections::string::String`) [E0308]
Run Code Online (Sandbox Code Playgroud)
虽然这个答案描述了如何从一个转换到另一个,但我仍然想知道为什么不像&String通常那样"强迫"(如果这是正确的术语)&str.