首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >锈蚀中的FizzBuzz

锈蚀中的FizzBuzz
EN

Code Review用户
提问于 2019-01-06 19:33:51
回答 1查看 730关注 0票数 0

我希望使fizzbuzz方法返回已解析的值,然后将其传递给println!。对&str和字符串有很大的问题。我想使用&str作为返回值,因为它是不可变的,所以我认为它很适合,尽管我无法正确地得到它。

这是我的弦刺:

代码语言:javascript
复制
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")等等?

EN

回答 1

Code Review用户

回答已采纳

发布于 2019-01-06 20:12:41

想要使用&str作为返回值,因为它是不可变的

这是不可能的,因为函数可能在value中生成一个新的、拥有的字符串,在这一行中:

代码语言:javascript
复制
    (_, _) => value.to_string()

所有其他匹配的臂都可以返回一个&'static str,因为它们是字符串文本,但是这个匹配臂的输出是一个String。您不会改变字符串的事实并不会改变这里的情况,因为无论如何都需要构造一个新的字符串。

对于某个值可以借用或拥有数据的情况,您可以考虑使用Cow

代码语言:javascript
复制
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()调用是将基本类型( &strString)转换为Cow所必需的。

其他问题:

  • 函数末尾的return语句是多余的。你可以只写表达式,没有分号在结尾。
  • 您没有在main中使用变量D20
  • 虽然完全是主观的,但是当程序逻辑中没有考虑负数时,可以使用u32而不是i32

有没有一种方法可以使它更简单,而不必调用直接的println!("Fizzbuzz")等等?

除了给出的建议之外,我担心给定的代码看起来足够简单和可读性。这个函数不包含一个非常复杂的逻辑。

票数 6
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/210989

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档