小编Bil*_*ser的帖子

从HashMap或Vec返回引用会导致借用超出其所在的范围?

我有一个持久的编译错误,其中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)

rust borrow-checker

16
推荐指数
1
解决办法
1836
查看次数

为实现Trait的类型实现Borrow <Trait>

比方说我有一些特点:

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)

rust

7
推荐指数
1
解决办法
797
查看次数

如何更改StorageFile上的DateCreated?

根据http://msdn.microsoft.com/en-us/library/windows/apps/windows.storage.storagefile.datecreated.aspx,StorageFile.DateCreated是只读的.

在桌面上,我可以这样做:

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.

还有其他方法可以做到这一点吗?

c# windows-phone-8 windows-store-apps

5
推荐指数
1
解决办法
729
查看次数

为什么Option <&String>不能强制选择<&str>?

我有一个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.

rust

5
推荐指数
2
解决办法
863
查看次数