(done) 速通 rustlings(15) 字符串

String 和 &str

String 类型会拥有字符串的所有权

&str 类型属于不可变借用,不会拥有字符串的所有权

rust 复制代码
// TODO: Fix the compiler error without changing the function signature.
fn current_favorite_color() -> String {
    "blue".to_string()
}

fn main() {
    let answer = current_favorite_color();
    println!("My current favorite color is {answer}");
}

String 和 &str 的转换

在 String 类型前面加上 & 即可得到 "不可变借用",传参时要保持类型一致,编译器不会自动把 String 转 &str

rust 复制代码
// TODO: Fix the compiler error in the `main` function without changing this function.
fn is_a_color_word(attempt: &str) -> bool {
    attempt == "green" || attempt == "blue" || attempt == "red"
}

fn main() {
    let word = String::from("green"); // Don't change this line.

    // borrow `word` as &str so the function signature still matches
    if is_a_color_word(&word) {
        println!("That is a color word I know!");
    } else {
        println!("That is not a color word I know.");
    }
}

String 和 &str 的内置函数

RUST 为字符串类型内置了函数,它们有的返回 String,有的返回 &str

rust 复制代码
fn trim_me(input: &str) -> &str {
    // TODO: Remove whitespace from both ends of a string.
    input.trim()
}

fn compose_me(input: &str) -> String {
    // TODO: Add " world!" to the string! There are multiple ways to do this.
    input.to_string() + " world!"
}

fn replace_me(input: &str) -> String {
    // TODO: Replace "cars" in the string with "balloons".
    input.replace("cars", "balloons")
}

fn main() {
    // You can optionally experiment here.
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn trim_a_string() {
        assert_eq!(trim_me("Hello!     "), "Hello!");
        assert_eq!(trim_me("  What's up!"), "What's up!");
        assert_eq!(trim_me("   Hola!  "), "Hola!");
    }

    #[test]
    fn compose_a_string() {
        assert_eq!(compose_me("Hello"), "Hello world!");
        assert_eq!(compose_me("Goodbye"), "Goodbye world!");
    }

    #[test]
    fn replace_a_string() {
        assert_eq!(
            replace_me("I think cars are cool"),
            "I think balloons are cool",
        );
        assert_eq!(
            replace_me("I love to look at cars"),
            "I love to look at balloons",
        );
    }
}

更多内置函数

rust 复制代码
// Calls of this function should be replaced with calls of `string_slice` or `string`.
fn placeholder() {}

fn string_slice(arg: &str) {
    println!("{arg}");
}

fn string(arg: String) {
    println!("{arg}");
}

// TODO: Here are a bunch of values - some are `String`, some are `&str`.
// Your task is to replace `placeholder(...)` with either `string_slice(...)`
// or `string(...)` depending on what you think each value is.
fn main() {
    string_slice("blue");

    string("red".to_string());

    string(String::from("hi"));

    string("rust is fun!".to_owned());

    string("nice weather".into());

    string(format!("Interpolation {}", "Station"));

    // WARNING: This is byte indexing, not character indexing.
    // Character indexing can be done using `s.chars().nth(INDEX)`.
    string_slice(&String::from("abc")[0..1]);

    string_slice("  hello there ".trim());

    string("Happy Monday!".replace("Mon", "Tues"));

    string("mY sHiFt KeY iS sTiCkY".to_lowercase());
}

相关推荐
techdashen20 小时前
Rust 泛型 vs Java 泛型:它们看起来相似,但骨子里截然不同
java·开发语言·rust
codealy20 小时前
Rust 核心理论与内存安全(二)
安全·rust
Rust研习社20 小时前
告别环境混乱!使用 mise 管理你的开发环境
前端·后端·rust
小杍随笔21 小时前
【Tauri 2.x 自定义 WebView2 用户数据目录完全指南】
架构·rust
樱桃花下的小猫1 天前
Rust 服务器存档管理 & 地图配置指南
服务器·rust·云鸢互联·零门槛一键开服·腐蚀rust服务器·腐蚀rust稳定低延迟联机·腐蚀rust服务器一键开服
红尘散仙1 天前
一个 `#[uniffi::export]`,把 Rust 接进 React Native
前端·后端·rust
红尘散仙1 天前
一行 `#[specta::specta]`,让 Tauri IPC 有类型
前端·后端·rust
codealy2 天前
Rust 核心理论与内存安全(一)
后端·安全·rust
土豆.exe2 天前
IfAI v0.5.0 深度技术解析:120,000 行 Rust 打造的 AI-Native 编辑器
rust·编辑器·ai-native
咸甜适中2 天前
rust语言学习笔记Trait之 AsRef 和 AsMut(引用转换)
笔记·学习·rust