当我遵循 Ruby rubocop 风格指南并使用 .0? 而不是 == 0 时,方法失败



我正在尝试用Ruby完成一个编码练习,如下所示:

TODO:从整数数组开始,返回一个包含整数和"Fizz"、"Buzz"或"FizzBuzz"的数组

编写一个方法fizz_buzz,该方法将number作为参数,然后返回 从 1 到numbernumber元素数组,但替换了一些 他们根据这些规则:

  • 如果该数字可被3整除,则将其替换为'Fizz'
  • 如果该数字可被5整除,则将其替换为'Buzz'
  • 如果该数字可以被35整除,则将其替换为'FizzBuzz'写入

如果我遵循一个rubocop style guide,我们在完成任务后被要求使用它,并且按照指示使用.zero而不是== 0?我的方法失败了,我不明白为什么。

我现在失败的解决方案,我的风格指南要求的编辑:

def fizz_buzz(number)
fail ArgumentError, "#{number} is less than 1" if number < 1
a = [number]
while number > 1
number = number - 1
a.unshift(number)
a.map! { |x| (x % 15).zero? ? 'FizzBuzz' : x }
a.map! { |x| (x % 3).zero? ? 'Fizz' : x }
a.map! { |x| (x % 5).zero? ? 'Buzz' : x }
end
a
end
should return the array [ 1, 2, 'Fizz' ] for number 3 (FAILED - 1)
should return the array [ 1, 2, 'Fizz', 4, 'Buzz', 'Fizz', 7 ] for number 7 (FAILED - 2)
should return an array with 'FizzBuzz' at the 15th element of the array (15 is divisible by both 3 and 5) (FAILED - 3)

失败:

1) fizz_buzz should return the array [ 1, 2, 'Fizz' ] for number 3
Failure/Error: a.map! { |x| (x % 5).zero? ? 'Buzz' : x }
NoMethodError:
undefined method `zero?' for "Fizz":String
# ./lib/fizz_buzz.rb:12:in `block in fizz_buzz'
# ./lib/fizz_buzz.rb:12:in `map!'
# ./lib/fizz_buzz.rb:12:in `fizz_buzz'
# ./spec/fizz_buzz_spec.rb:13:in `block (2 levels) in <top (required)>'
2) fizz_buzz should return the array [ 1, 2, 'Fizz', 4, 'Buzz', 'Fizz', 7 ] for number 7
Failure/Error: a.map! { |x| (x % 5).zero? ? 'Buzz' : x }
NoMethodError:
undefined method `zero?' for "Fizz":String
# ./lib/fizz_buzz.rb:12:in `block in fizz_buzz'
# ./lib/fizz_buzz.rb:12:in `map!'
# ./lib/fizz_buzz.rb:12:in `fizz_buzz'
# ./spec/fizz_buzz_spec.rb:17:in `block (2 levels) in <top (required)>'
3) fizz_buzz should return an array with 'FizzBuzz' at the 15th element of the array (15 is divisible by both 3 and 5)
Failure/Error: a.map! { |x| (x % 5).zero? ? 'Buzz' : x }
NoMethodError:
undefined method `zero?' for "Fizz":String
# ./lib/fizz_buzz.rb:12:in `block in fizz_buzz'
# ./lib/fizz_buzz.rb:12:in `map!'
# ./lib/fizz_buzz.rb:12:in `fizz_buzz'
# ./spec/fizz_buzz_spec.rb:21:in `block (2 levels) in <top (required)>'

我的工作解决方案不符合风格指南:

def fizz_buzz(number)
fail ArgumentError, "#{number} is less than 1" if number < 1
a = [number]
while number > 1
number = number - 1
a.unshift(number)
a.map! { |x| (x % 15) == 0 ? 'FizzBuzz' : x }
a.map! { |x| (x % 3) == 0 ? 'Fizz' : x }
a.map! { |x| (x % 5) == 0 ? 'Buzz' : x }
end
a
end

随分配的任务一起提供的解决方案:

# def fizz_buzz(number)
#   fail ArgumentError, "#{number} should be greater than 1" if number < 1
#   (1..number).map do |i|
#     if (i % 3).zero? && (i % 5).zero?
#       'FizzBuzz'
#     elsif (i % 3).zero?
#       'Fizz'
#     elsif (i % 5).zero?
#       'Buzz'
#     else
#       i
#     end
#   end
# end

现在我们看到失败的代码,下面是它失败的原因:

您有一个数组a我想您打算在其中包含结果。你在前面加上数字,并修复需要说"嘶嘶声"或"嗡嗡声"或"嗡嗡声"的数字。这将起作用,但对于一个关键故障:您在循环的每次迭代中处理数组。如果你只是修复它一次,就在你归还它之前,它会很好。但是,这样,发生的情况是(例如,对于输入值4(:

  • 4开始阵列
  • 您运行修复程序,但4很好,不需要修复
  • 你预置3
  • 运行修复程序;阵列现在已["Fizz", 4]。目前为止,一切都好。
  • 你预置2;数组是[2, "Fizz", 4]
  • 运行修补程序。2没有干预就过去了,那么轮到"Fizz"了。
  • "Fizz"不是一个数字,因此您不调用Number#%、余数运算符,而是调用String#%、格式运算符。字符串"Fizz"中没有格式符号,因此格式化运算符不做任何有趣的事情并返回字符串"Fizz"
  • 然后你测试它是否为零。当你尝试"Fizz" == 0时,它会是"Duh,no"并且只是返回false,因为所有类(以BasicObject开头(都定义了#==。但"Fizz".zero?失败了,因为与Number#zero?不同,String#zero?不是一回事。

最新更新