【问题标题】:How do I transform &str to ~str in Rust?如何在 Rust 中将 &str 转换为 ~str?
【发布时间】:2013-03-01 00:56:29
【问题描述】:

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

假设我想对一些字符串进行 for each,并且我的闭包采用借用的字符串指针参数 (&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。但这只是一个例子。

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

【问题讨论】:

  • 鉴于 Rust 是 1.X,现在这不太重要。 (Rust 1.X 使用 String&str,而不是 ~str)因此,将其标记为 pre-Rust 1.0 会很有帮助。我希望搜索引擎的相关性可以相应调整。
  • 我在这里可能不合时宜,但我已投票结束这个问题,因为它不适用于当前的 Rust 语法,其中不包括 ~

标签: string pointers rust rust-obsolete


【解决方案1】:

您应该调用 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 trait 文档在这里:

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

【讨论】:

    【解决方案2】:

    你不能。

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

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

    所以你可以使用read_line 或制作一个副本,我……不太清楚该怎么做:)

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 我也试过“复制行”。对我来说,他们提供了一种读取所有行的方法,这对我来说似乎很奇怪,但它给了你借来的指针,你不能复制它们。似乎 str::from_slice 使用了不安全的原始字节副本。
      • 是的,它会复制字符串。正是您创建拥有指针所需要的。如果函数按预期工作,我认为函数下方是否存在不安全的调用并不重要。无论如何,我们在最深层次上都有不安全的操作。
      • @DmitryBelyaev 谢谢。我更感兴趣的是它是如何实现的,看看是否有推荐的方法来复制借来的字符串。
      猜你喜欢
      • 2021-02-27
      • 1970-01-01
      • 1970-01-01
      • 2017-05-01
      • 2018-06-10
      • 1970-01-01
      • 1970-01-01
      • 2014-04-03
      相关资源
      最近更新 更多