如何在 Ruby 中使用多个条件修改数组

How to modify array using multiple conditions in Ruby

提问人:Clever Júnior 提问时间:2/12/2023 更新时间:2/12/2023 访问量:81

问:

我今天开始学习 Ruby,我还不明白如何修改具有多个条件的数组,我搜索过这个并阅读了文档,但只找到了一个条件。

我尝试了 map、filter_map、for in 和其他方法,但我不知道做错了什么。我做这个测试:

def test_fuzz_buzz
    input = [2, 15, 7, 9, 45]
    expected_output = ["bug!", "fizzBuzz", "bug!", "fizz", "fizzBuzz"]

    assert_equal expected_output, Challenges.fizz_buzz(input)

    input = [7, 9]
    expected_output = ['bug!', 'fizz']

    assert_equal expected_output, Challenges.fizz_buzz(input)

    input = [9, 25]
    expected_output = ['fizz', 'buzz']

    assert_equal expected_output, Challenges.fizz_buzz(input)
  end

我的目标是用嘶嘶声替换 3 个倍数,用嗡嗡声替换 5 个倍数,否则用错误替换!

 def fizz_buzz(numbers_arr)
    # numbers_arr.each { |number|
    #   number = 'fizz' if number % 3 === 0
    #   number = 'buzz' if number % 5 === 0
    #   number = 'bug!' if number != 'fuzz' || 'buzz'
    # }

    # numbers_arr.map { |number|
    #   number = 'fizz' if number % 3 === 0
    #   number = 'buzz' if number % 5 === 0
    #   number = 'bug!' if number != 'fuzz' || 'buzz'
    # }

    numbers_arr.filter_map { |number|
      number = 'fizz' if number % 3 === 0
      number = 'buzz' if number % 5 === 0
      # number = 'bug!' if number != 'fuzz' || 'buzz'
    }

    numbers_arr.select { |number| number % 3 === 0 }.map { |number| number ='fizz' }
  end
数组 Ruby 方法 条件语句

评论

3赞 Jörg W Mittag 2/12/2023
您的预期输出与规范不匹配。 并且可以被 和 整除,因此它们应该被 or 替换(规范对此不清楚,所以你可以选择任何一个),但规范中没有一处说它们应该被 替换。154535'fizz''buzz''fizzBuzz'

答:

1赞 Chris 2/12/2023 #1

你的问题是这不是它的工作方式。它们将对象映射到它们传递的块中计算的最后一个表达式。这看起来可以工作,因为在下面,表达式的计算结果为 。#mapEnumerablex = 55

irb(main):001:0> [1,2,3].map { |x| x = 5 }
=> [5, 5, 5]

但是,如果我们在最后一个表达式上附加一个条件,我们会看到它没有达到您的期望。

irb(main):002:0> [1,2,3].map { |x| x = 5 if x == 2 }
=> [nil, 5, nil]

您会期望,但由于第一个和最后一个元素不满足条件,因此该表达式的计算结果为 。[1,5,3]nil

不过,使用条件表达式作为最后一个元素是可行的。

def fizz_buzz(nums)
  nums.map do |n|
    if n % 15 == 0
      "fizzBuzz"
    elsif n % 5 == 0
      "Buzz"
    elsif n % 3 == 0
      "fizz"
    else
      "bug!"
    end
  end
end
irb(main):016:0> fizz_buzz [2, 15, 7, 9, 45]
=> ["bug!", "fizzBuzz", "bug!", "fizz", "fizzBuzz"]