我正在尝试创建pub fn sing(start: i32, end: i32) -> String
,它会在start
和end
之间的每个数字上重复调用pub fn verse(num: i32) -> String
的结果的连接字符串。如何迭代向后范围?
我GOOGLE的答案,似乎Rust String concatenation回答我的问题,如果我即使在playground写我的代码它的工作原理,但:
我的代码:
pub fn verse(num: i32) -> String {
match num {
0 => "No more bottles of beer on the wall, no more bottles of beer.\nGo to the store and buy some more, 99 bottles of beer on the wall.\n".to_string(),
1 => "1 bottle of beer on the wall, 1 bottle of beer.\nTake it down and pass it around, no more bottles of beer on the wall.\n".to_string(),
2 => "2 bottles of beer on the wall, 2 bottles of beer.\nTake one down and pass it around, 1 bottle of beer on the wall.\n".to_string(),
num => format!("{0} bottles of beer on the wall, {0} bottles of beer.\nTake one down and pass it around, {1} bottles of beer on the wall.\n",num,(num-1)),
}
}
pub fn sing(start: i32, end: i32) -> String {
(start..end).fold(String::new(), |ans, x| ans+&verse(x))
}
问题是
#[test]
fn test_song_8_6() {
assert_eq!(beer::sing(8, 6), "8 bottles of beer on the wall, 8 bottles of beer.\nTake one down and pass it around, 7 bottles of beer on the wall.\n\n7 bottles of beer on the wall, 7 bottles of beer.\nTake one down and pass it around, 6 bottles of beer on the wall.\n\n6 bottles of beer on the wall, 6 bottles of beer.\nTake one down and pass it around, 5 bottles of beer on the wall.\n");
}
失败beer::sing(8,6)
返回""
。
非常感谢。为什么范围只是迭代前进? –
@CalebJasik:它不是真的只是向前迭代,而是比典型的半开放范围模型:'[开始结束]'。在这个意义上,'start == end'表示一个空的范围,'start> = end'表示一个错误。它也使得范围代码更简单(从而更快)。对于反向迭代,你明确地调用'rev',你就完成了。 –