我尝试在From
和Into
的帮助下实现行长度编码。我的想法是,我将仅实施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`
我做错了什么?
答案 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 = RLE
和T = &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不会从另一个算法中实现一个算法。你必须自己做。