1

所以最初我只是在玩 ole 'FizzBu​​zz' 挑战。对于那些可能不知道这个挑战是什么的人,请允许我解释一下。这个想法是打印出数字1..100,如果数字可以被 整除3,它会打印Fizz而不是3; 如果数字可以被 整除5,则打印Buzz;如果 number 可以被两者整除,则打印FizzBuzz. 这就是我执行挑战的方式:

def super_fizzbuzz(array)  
  array.each do |element|
    if element % 15 == 0 
      puts 'FizzBuzz'
    elsif element % 5 == 0
      puts 'Buzz'
    elsif element % 3 == 0
       puts "Fizz"
    else 
       puts element
    end
  end
end

这将按预期工作。我想要做的是拥有它,以便用户可以放入一个整数数组super_fizzbuzz([3,10,15,19])并让它返回数组,并用适当的单词替换数字:[Fizz, Buzz, FizzBuzz, 19]。但是,我似乎无法执行此操作。我在下面尝试了以下方法,但它只将第一个答案添加到数组中。

super_array = []
array.each do |element|
  if element % 15 == 0 
    super_array[element] << 'FizzBuzz'
  elsif element % 5 == 0
    super_array << 'Buzz'
  elsif element % 3 == 0
    super_array << "Fizz"
  else
    super_array << element
  end

  return super_array
end

我的想法是创建一个新数组,如果元素可以被其中一个或两个数字整除,则将其放入新数组中,如果不是,则将元素放入数组中。但是,当我运行它时会发生什么,它只会返回一个带有Fizz. 如果我运行第一个代码并将数字放在一个数组中,它会返回:

Fizz
Buzz
FizzBuzz
19
[3, 10, 15, 19]

任何建议将不胜感激。

4

2 回答 2

3

return super_array

这个声明说“停止你正在做的一切并立即返回这个值”

因此,第一次通过数组时,您会得到一个答案……然后点击这个结果,然后返回这个数组结果,而不继续遍历数组的其余部分。

可能您想要的只是在遍历整个原始数组后才返回新的“super_array”值......所以我将它移到循环之外,例如:

super_array = []
array.each do |element|
  if element % 15 == 0 
    super_array[element] << 'FizzBuzz'
  elsif element % 5 == 0
    super_array << 'Buzz'
  elsif element % 3 == 0
    super_array << "Fizz"
  else
    super_array << element
  end
end
return super_array # only return once through the whole array
于 2015-05-18T00:34:08.847 回答
1

由于提到@mu 太短,这是使用Enumerable'map方法的主要情况:

nums = [3, 15, 29, 42, 18, 63, 10]

def to_fizzbuzz
  if self % 15 == 0
    "FizzBuzz"
  elsif self % 5 == 0
    "Buzz"
  elsif self % 3 == 0
    "Fizz"
  else
    self
  end
end

nums.map(&:to_fizzbuzz) #=> ["Fizz", "FizzBuzz", 29, "Fizz", "Fizz", "Buzz"]
于 2015-05-18T02:18:37.090 回答