所以我试图在字符串中找到模式并将其转换为整数。
首先我寻找一个字符串:
let haystack = "HTTP/1.1 200\r\n";
let needle = "HTTP/1.";
let http_location = haystack.rfind(needle);
if (http_location.is_some()) {
现在我已经找到了它,我可以想出两种方法来获取数字状态。任何一个:
    let mut temp_str = haystack.char_at(http_location.unwrap());
    let status = String::from_str(temp_str);
}
或者:
    let status = String::from_str(&haystack[http_location.unwrap()]);
}
不幸的是,它们都已被弃用(而且可能是错误的)。目前这样做的正确方法是什么?
另外,这部分的风格正确吗?:
let http_location = haystack.rfind(needle);
if (http_location.is_some())
解析是一个广泛而多样的主题。有简单的解析工具,也有高性能的解析工具以及介于两者之间的一系列工具。
fn main() {
    let haystack = "HTTP/1.1 200\r\n";
    let needle = "HTTP/1.";
    let z: Option<u8> = haystack.rfind(needle).and_then(|pt| {
        let after_match = &haystack[(pt + needle.len())..];
        after_match.splitn(2, " ").next()
    }).and_then(|val| {
        val.parse().ok()
    });
    println!("{:?}", z)
}
rfind在这里,我们像以前一样使用,这可能会失败。and_then如果结果是 ,我们用来运行闭包Some。第一个闭合将针后的绳子切开,然后将其分成空格,最多分为 2 部分。这可能会失败,因此我们使用第二个and_then来使用parse,它也可能因 a 而失败Result,因此我们将其转换为 anOption以保留类型。
最后,我们仍然可能会失败,因为我们解析的东西可能不是一个可解析的数字!
Rust 确实可以帮助你明确可能失败的地方,并且你必须处理它们。^_^
在这种情况下:
None。这是使用regex crate的替代解决方案:
extern crate regex;
use regex::Regex;
fn main() {
    let haystack = "HTTP/1.1 200\r\n";
    let re = Regex::new(r"HTTP/1.(\d) (\d+)\r\n").unwrap();
    let captures = re.captures(haystack).unwrap();
    let version: Option<u8> = captures.at(1).and_then(|version| version.parse().ok());
    let status: Option<u8> = captures.at(2).and_then(|version| version.parse().ok());
    assert_eq!(Some(1), version);
    assert_eq!(Some(200), status);
    println!("Version: {:?}, Status: {:?}", version, status);
}
您会发现我们有相同类型的故障模式,但结构有点不同。
Result或者也许是使用and的版本try!:
#[derive(Debug,Copy,Clone,PartialEq)]
enum Error {
    StartNotFound,
    NotANumber,
}
fn parse_it(haystack: &str) -> Result<u8, Error> {
    let needle = "HTTP/1.";
    let pt = try!(haystack.rfind(needle).ok_or(Error::StartNotFound));
    let after_match = &haystack[(pt + needle.len())..];
    let val = after_match.splitn(2, " ").next().unwrap();
    val.parse().map_err(|_| Error::NotANumber)
}
fn main() {
    println!("{:?}", parse_it("HTTP/1.1 200\r\n"));
    println!("{:?}", parse_it("HTTP/1"));
    println!("{:?}", parse_it("HTTP/1.cow"));
}