即使我实现了`From&lt;&amp; str&gt;,但是特性限制`&amp; str:From <mytype>`也不满意。对于MyType`

时间:2017-06-04 10:35:41

标签: rust

我尝试在FromInto的帮助下实现行长度编码。我的想法是,我将仅实施from并免费获得into

extern crate regex;

use regex::Regex;

struct RLE(pub String);

impl<'a> From<&'a str> for RLE {
    fn from(s: &str) -> Self {
        let reg = Regex::new(r"(\d*)([\w\s])").unwrap();
        let mut accum = String::new();
        for c in reg.captures_iter(s) {
            let n = c.get(1).unwrap().as_str().parse::<usize>().unwrap_or(1);
            let c = c.get(2).unwrap().as_str();
            accum.push_str(&c.repeat(n));
        }
        RLE(accum)
    }
}
  

解码(&#34; 2ab3c&#34;)=&gt; &#34; aabccc&#34;

pub fn decode(s: &str) -> String {
    let RLE(string) = RLE::from(s);
    string
}
  

编码(&#34; aabccc&#34;)=&gt; &#34; 2ab3c&#34;

pub fn encode(s: &str) -> String {
    let string: &'static str = RLE(s.to_string()).into();
    string.to_string()
}

但是我收到以下错误:

error[E0277]: the trait bound `&str: std::convert::From<RLE>` is not satisfied
  --> src/main.rs:26:51
   |
26 |     let string: &'static str = RLE(s.to_string()).into();
   |                                                   ^^^^ the trait `std::convert::From<RLE>` is not implemented for `&str`
   |
   = note: required because of the requirements on the impl of `std::convert::Into<&str>` for `RLE`

我做错了什么?

2 个答案:

答案 0 :(得分:7)

你已经倒退了。 From<&str> for RLE无法可能用于执行RLE&str转换。这就像用一个烤饼来烤蛋糕,把它解构成它的组成成分。

From<&str> for RLE表示存在Into<RLE> for &str。这意味着您可以a_str.into()而不是RLE::from(a_str)。您可以通过查看the documentation for Into来解决此问题,其中列出了以下实现:

impl<T, U> Into<U> for T where U: From<T>

如果您替换From实施的类型(使用U = RLET = &str),则会获得:

impl Into<RLE> for &str where RLE: From<&str>

您要对REL(s.to_string()).into()进行的操作需要impl Into<&str> for RLE

答案 1 :(得分:5)

  

我的想法是,我将仅实施并免费实施......

有效!

您可以使用From,如

pub fn decode(s: &str) -> String {
    let RLE(string) = RLE::from(s);
    string
}

您可以使用Into,如

pub fn decode_using_into(s: &str) -> String {
    let RLE(string) = s.into();
    string
}
  

但我得到以下错误

好吧,就像DK一样。说,Rust不会从另一个算法中实现一个算法。你必须自己做。