从字符串中获取单个字符

时间:2015-06-12 19:49:14

标签: string rust

我想获得std::str的第一个字符。方法char_at()目前不稳定,slice_chars中的std::string::String也是如此。

我目前唯一提出的选择如下:

let text = "hello world!";
let char_vec:Vec<char> = text.chars().collect();
let ch = char_vec[0];

但这对于获得单个字符似乎过分,而不是使用向量的其余部分。

4 个答案:

答案 0 :(得分:48)

UTF-8没有定义&#34;字符&#34;是这样取决于你想要什么。在这种情况下,char是Unicode标量值,因此char的第一个&str将在1到4个字节之间。

如果您只想要第一个char,那么请不要收集到Vec<char>,只需使用迭代器:

let text = "hello world!";
let ch = text.chars().next().unwrap();

答案 1 :(得分:1)

我写了一个函数,它返回fn car_cdr(s: &str) -> (&str, &str) { for i in 1..5 { let r = s.get(0..i); match r { Some(x) => return (x, &s[i..]), None => (), } } (&s[0..0], s) } 的头部,其余部分:

let (first_char, remainder) = car_cdr("test");
println!("first char: {}\nremainder: {}", first_char, remainder);

像这样使用:

first char: t
remainder: est

输出如下:

<div class="collapse navbar-collapse" id="navbarResponsive">
        <ul class="navbar-nav ml-auto">
            <li class="nav-item active">
                <a class="nav-link" id="home" href="#">HOME</a>
            </li>
            <li class="nav-item">
                <a class="nav-link" id="portfolio" href="#">PORTFOLIO</a>
            </li>
            <li class="nav-item">
                <a class="nav-link" id="about" href="#">ABOUT</a>
            </li>
            <li class="nav-item">
                <a class="nav-link" id="contact" href="#">CONTACT</a>
            </li>
        </ul>
    </div>

对于超过1个字节的字符,它可以正常工作。

答案 2 :(得分:-1)

let my_string = String::from("Rust");

let first_one = &my_string[0..1].to_string();
let first_two = &my_string[0..2].to_string();

let last_one = &my_string[my_string.len() - 1..].to_string();
let last_two = &my_string[my_string.len() - 2..].to_string();

println!("first one: {}", first_one);
println!("first two: {}", first_two);
println!("");
println!("last one: {}", last_one);
println!("last one: {}", last_two);
println!("");

let date = String::from("2020-12-01");

let day = &date[date.len() - 2..date.len()].to_string();
let month = &date[5..7].to_string();
let year = &date[0..4].to_string();

println!("day: {}", day);
println!("month: {}", month);
println!("year: {}", year);

输出

first one: R
first two: Ru

last one: t  
last one: st 

day: 01      
month: 12    
year: 2020   

警告:确保您具有String的那些索引

// if you put index out of range:
let first_ten = &my_string[0..10].to_string();

结果:错误:字节索引10超出字符串Rust的范围

答案 3 :(得分:-5)

接受的答案有点难看!

let text = "hello world!";

let ch = &text[0..1]; // this returns "h"