如何在Rust中将& str转换为~str?

时间:2013-03-13 07:35:24

标签: string pointers rust

顺便提一下,这是针对当前的0.6 Rust trunk,不确定是否确实提交。

假设我想在每个字符串中使用,并且我的闭包采用了一个借用的字符串指针参数(& str)。我希望我的闭包将其参数添加到拥有的字符串〜[〜str]的拥有向量中以便返回。我对Rust的理解很弱,但我认为字符串是一个特殊情况,你不能用*右解引它们?如何将& str中的字符串转换为vector的push方法,该方法需要〜str?

这是一些无法编译的代码

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。但这只是一个例子。

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

3 个答案:

答案 0 :(得分:11)

你应该调用StrSlice trait的方法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

答案 1 :(得分:4)

你不能。

首先,它在语义上不起作用:~str承诺一次只有一件事拥有它。但借用了&str,那么你借来的地方会发生什么?它无法知道你是在试图窃取其唯一的引用,除了它之外将调用者的数据从其中删除也是非常粗鲁的。

另一方面,它在逻辑上不起作用:~ - 指针和@ - 指针分配在完全不同的堆中,&不知道哪个堆,因此无法转换为~,仍然可以保证基础数据位于正确的位置。

所以你可以使用read_line或制作一份副本,我不太确定该怎么做:)

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

答案 2 :(得分:4)

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

所以我找到了str::from_slice(s: &str) -> ~str。这可能就是你所需要的。