我希望使fizzbuzz方法返回已解析的值,然后将其传递给println!。对&str和字符串有很大的问题。我想使用&str作为返回值,因为它是不可变的,所以我认为它很适合,尽管我无法正确地得到它。
这是我的弦刺:
fn main() {
let ss = "FizzBuzz";
for i in 1..100 {
println!("{}", fizzbuzz(i))
}
}
fn fizzbuzz(value: i32) -> String {
return match (value % 3, value % 5) {
(0, 0) => "FizzBuzz".into(),
(0, _) => "Fizz".into(),
(_, 0) => "Buzz".into(),
(_, _) => value.to_string()
};
}有没有一种方法可以使它更简单,而不必调用直接的println!("Fizzbuzz")等等?
发布于 2019-01-06 20:12:41
想要使用&str作为返回值,因为它是不可变的
这是不可能的,因为函数可能在value中生成一个新的、拥有的字符串,在这一行中:
(_, _) => value.to_string()所有其他匹配的臂都可以返回一个&'static str,因为它们是字符串文本,但是这个匹配臂的输出是一个String。您不会改变字符串的事实并不会改变这里的情况,因为无论如何都需要构造一个新的字符串。
对于某个值可以借用或拥有数据的情况,您可以考虑使用Cow。
fn fizzbuzz(value: i32) -> Cow<'static, str> {
match (value % 3, value % 5) {
(0, 0) => "FizzBuzz".into(),
(0, _) => "Fizz".into(),
(_, 0) => "Buzz".into(),
(_, _) => value.to_string().into()
}
}这个函数的内存效率略高:前三个守卫将返回一个借用的静态字符串(Cow::Borrowed),而最后一个将拥有一个字符串(Cow::Owned)。.into()调用是将基本类型( &str或String)转换为Cow所必需的。
其他问题:
return语句是多余的。你可以只写表达式,没有分号在结尾。main中使用变量D20。u32而不是i32。有没有一种方法可以使它更简单,而不必调用直接的
println!("Fizzbuzz")等等?
除了给出的建议之外,我担心给定的代码看起来足够简单和可读性。这个函数不包含一个非常复杂的逻辑。
https://codereview.stackexchange.com/questions/210989
复制相似问题