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