RubyでFizzBuzz書いてハマった話

学んだこと TL;DR

putsはnilを戻り値として返す。

最初のコード

def fizz_buzz(num)
  if num % 15 == 0
    puts "Fizz Buzz"
  elsif num % 3 == 0
    puts "Fizz"
  elsif num % 5 == 0
    puts "Buzz"
  else
    puts num.to_s
  end
end

require 'minitest/autorun'

class FizzBuzzTest < Minitest::Test
  def test_fizz_buzz
    assert_equal '1', fizz_buzz(1)
    assert_equal '2', fizz_buzz(2)
    assert_equal 'Fizz', fizz_buzz(3)
    assert_equal '4', fizz_buzz(4)
    assert_equal 'Buzz', fizz_buzz(5)
    assert_equal 'Fizz', fizz_buzz(6)
    assert_equal 'Fizz Buzz', fizz_buzz(15)
  end
end

実行結果

あれ?最初のアサーションで処理が止まってる??なんでや、、

修正後のコード

def fizz_buzz(num)
  if num % 15 == 0
     "Fizz Buzz"
  elsif num % 3 == 0
     "Fizz"
  elsif num % 5 == 0
     "Buzz"
  else
     num.to_s
  end
end

require 'minitest/autorun'
class FizzBuzzTest < Minitest::Test
  def test_fizz_buzz
    assert_equal '1', fizz_buzz(1)
    assert_equal '2', fizz_buzz(2)
    assert_equal 'Fizz', fizz_buzz(3)
    assert_equal '4', fizz_buzz(4)
    assert_equal 'Buzz', fizz_buzz(5)
    assert_equal 'Fizz', fizz_buzz(6)
    assert_equal 'Fizz Buzz', fizz_buzz(15)
  end
end

実行結果

ちゃんとテストパスできた〜

感想

puts やprintがnilを返すということは多分もう忘れないと思います。

あとrubyだとreturnをあんまり使わずに"文字列"だけを書いて戻り値とするんだなと知りました。