繁体   English   中英

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

[英]How do I transform &str to ~str in Rust?

这是针对当前0.6 Rust的干线,不确定确切的提交。

假设我想在每个字符串中使用,并且我的闭包采用了一个借用的字符串指针参数(&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。 但这只是一个例子。

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

您应该调用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

你不能。

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM