【问题标题】:String return value does not get assigned within for-loop in Rust在 Rust 的 for 循环中没有分配字符串返回值
【发布时间】:2016-10-26 15:22:50
【问题描述】:

鉴于此代码-sn-p:

pub fn verse(start_bottles: i32) -> String {
    let mut song_template: String = "%1 of beer on the wall, %2 of beer.\n%3, %4 of beer on the wall.\n".to_string();

    match start_bottles {
        0 => lyrics_no_bottles(&mut song_template),
        1 => lyrics_one_bottle(&mut song_template),
        2 => lyrics_two_bottles(&mut song_template),
        _ => lyrics_more_bottles(&mut song_template, start_bottles)
    }
    song_template
}

pub fn sing(first: i32, last: i32) -> String {
    let mut song: String = "".to_string();
    for num in (8..6).rev() {
        song = verse(1);
    }
    song
}

当我输出 verse(1) 时,它工作正常 - 测试的字符串出现并且是完整的。但是当我将verse(1) 的结果分配给String 绑定song 时,song 似乎是空的?我不明白这种行为。

【问题讨论】:

  • 只是对您的代码的评论,与问题无关:当您的右侧已经是一个字符串时,您可以删除那些显式的 String 类型注释(如果使用to_string())。
  • 我保留它是为了便于阅读...我不太喜欢在每种情况下进行推理...想随时查看类型
  • 我可以完全理解这一点,但是在社区中确定一种编码风格非常重要,这样每个人都可以快速阅读其他人的代码,即使对于一种语言的新手来说感觉不对。但这在 SO 评论部分没有什么可解决的:)

标签: string for-loop rust variable-assignment


【解决方案1】:

因为范围不是这样工作的;它与字符串无关。如果您运行以下命令:

fn main() {
    for i in 8..6 {
        println!("a: {}", i);
    }
    for i in (8..6).rev() {
        println!("b: {}", i);
    }
    for i in 6..8 {
        println!("c: {}", i);
    }
    for i in (6..8).rev() {
        println!("d: {}", i);
    }
}

你会得到以下输出:

c: 6
c: 7
d: 7
d: 6

范围向上计数,从不向下计数。 rev 颠倒你给它的顺序;它不会将空序列变成非空序列。

【讨论】:

    猜你喜欢
    • 2020-03-30
    • 2019-02-20
    • 1970-01-01
    • 2019-07-11
    • 1970-01-01
    • 2016-01-31
    • 2019-06-21
    • 2015-11-13
    • 1970-01-01
    相关资源
    最近更新 更多