19

顺便说一下,这是针对当前 0.6 Rust 主干的,不确定确切的提交。

假设我想为每个字符串遍历一些字符串,并且我的闭包采用借用的字符串指针参数(&str)。我希望我的闭包将其参数添加到要返回的拥有字符串 ~[~str] 的拥有向量中。我对 Rust 的理解很薄弱,但我认为字符串是一种特殊情况,你不能用 * 取消引用它们,对吧?如何将我的字符串从 &str 获取到需要 ~str 的向量的 push 方法中?

这是一些无法编译的代码

fn read_all_lines() -> ~[~str] {
    let mut result = ~[];
    let reader = io::stdin();
    let util = @reader as @io::ReaderUtil;
    for util.each_line |line| {
        result.push(line);
    }
    result
}

它无法编译,因为它推断结果的类型为 [&str],因为这就是我要推动的。更不用说它的生命周期是错误的,因为我正在向它添加一个生命周期较短的变量。

我意识到我可以使用 ReaderUtil 的 read_line() 方法,它返回一个 ~str。但这只是一个例子。

那么,如何从借来的字符串中获取拥有的字符串?还是我完全误解了。

4

3 回答 3

11

您应该调用 StrSlice 特征的方法 to_owned,如下所示:

fn read_all_lines() -> ~[~str] {
    let mut result = ~[];
    let reader = io::stdin();
    let util = @reader as @io::ReaderUtil;
    for util.each_line |line| {
        result.push(line.to_owned());
    }
    result
}

StrSlice 特征文档在这里:

http://static.rust-lang.org/doc/core/str.html#trait-strslice

于 2013-03-21T09:04:31.553 回答
4

你不能。

一方面,它在语义上不起作用:a~str承诺一次只有一个东西拥有它。但是a&str是借来的,那么你借来的地方会发生什么?它无法知道您正在尝试窃取它的唯一引用,并且将调用者的数据从它下面丢弃是非常粗鲁的。

另一方面,它在逻辑上不起作用:~-pointers 和@-pointers 分配在完全不同的堆中,并且 a&不知道哪个堆,因此无法转换~并仍然保证底层数据位于正确的位置地方。

因此,您可以使用read_line或制作副本,我……不太确定该怎么做:)

我确实想知道为什么 API 是这样的,什么时候&是最受限制的指针。 ~在这里应该也能正常工作;它不像迭代的字符串已经存在于其他地方并且需要借用。

于 2013-03-13T07:50:45.737 回答
4

起初我认为可以使用copy line从借来的指针到字符串创建拥有指针,但这显然复制了隐藏的指针。

于是我发现str::from_slice(s: &str) -> ~str。这可能是您需要的。

于 2013-03-13T12:49:25.797 回答