Techioz Blog

Rubyで反復を適切にスキップするにはどうすればよいですか?

概要

文字列の長さが 4 に等しい場合に加算をスキップしようとしていますが、コードでエラーが発生します。

私のコードは次のとおりです。

strings = ["one", "two", "four", "abc", "fgh"]
total = strings.inject(0) do |sum, str|
  next if str.length == 4
 
  sum + str.length
end

puts total

そしてエラーはこう言います:

main.rb:13:in `block in <main>': undefined method `+' for nil:NilClass (NoMethodError)
        from main.rb:10:in `each'
        from main.rb:10:in `inject'
        from main.rb:10:in `<main>'

next if の仕事は反復をスキップすることではないでしょうか?誰か私が間違っていることを教えてくれませんか?ありがとう!

解決策

ここでエラーが発生するのは、next を呼び出すときにループの次の反復に nil を渡すことになるためです。

strings = ["one", "two", "four", "abc", "fgh"]
total = strings.inject(0) do |sum, str|
  next sum if str.length == 4
  sum + str.length
end

# => 12

next は実際には反復をスキップしません。これはブロックのさらなる実行を停止するだけであり、戻り値があります。