Techioz Blog

Rubyの「NoMethodError」

概要

Ruby を使用してこの Codewars の問題を解決しようとしていますが、このエラーが発生し続け、理由がわかりません。

main.rb:10:in `head_smash': undefined method `each' for "":String (NoMethodError)
from main.rb:80:in `block in <main>'
from /runner/frameworks/ruby/cw-2.rb:55:in `block in describe'
from /runner/frameworks/ruby/cw-2.rb:46:in `measure'
from /runner/frameworks/ruby/cw-2.rb:51:in `describe'
from main.rb:17:in `<main>'

この問題を解決するための私のコードは次のとおりです。

 def head_smash(arr)
  arr1 = []
    if arr == []
        return 'Gym is empty'
    elsif arr.is_a?(Integer) == true
        return 'This isn\'t the gym!!'
    else
      arr.each do |i| 
         arr1.append(i.gsub(/O/, ' '))
      end
    end
    return arr1
 end

どうすればこれを解決できますか?

解決策

コードが失敗するのは、おそらくこのテスト (この演習のテストの行 #64 を参照) です。

Test.assert_equals(head_smash(''),'Gym is empty')

このテストでは、入力は空の文字列ですが、コードは文字列タイプをチェックせず、少なくとも空の文字列を処理します。代わりに、arr が文字列の場合、コードは arr.each を呼び出します。

この特定の問題を解決する非常に簡単なアプローチは、最初の条件を変更することです。

if arr == []

以下のいずれかに

if arr == [] || arr == ''

if [[], ''].include?(arr)

if arr.respond_to?(:empty?) && arr.empty?