I\'m attempting to create pub fn sing(start: i32, end: i32) -> String that returns a concatenated string of the results of calling pub fn verse(num: i32) -
Your problem has nothing to do with string concatenation. It has to do with the fact that 8..6 is an empty iterator, because a range only iterates forwards. Because 8 >= 6, the iterator yields None on the first call to next.
fn main() {
for i in 8..6 {
println!("{}", i); // never reached
}
}
This can be fixed by swapping start and end and calling rev() to iterate backwards.
fn main() {
for i in (6..8).rev() {
println!("{}", i);
}
}
However, there's still another problem. In a range start..end, start is inclusive but end is exclusive. For example, the code above prints 7 and 6; 8 is not printed. See How do I include the end value in a range?
Putting it all together, sing should look like:
pub fn sing(start: i32, end: i32) -> String {
(end..=start)
.rev()
.fold(String::new(), |ans, x| ans + &verse(x))
}
Note: Your test still fails because it expects two newlines between each verse, but your code only generates one. I'll leave this up to you to fix.