SringIOは標準添付でありながら、あんまり使われる所を見かけないライブラリ*1です。
これは文字列にIOクラスの挙動を持たせる便利なものです。
このクラスのうち、StringIO#eachはちょっと特別な挙動をします。
引数に切り分け文字を指定してあげると、それに則って切り出してくれるのです。
FSみたいなもんですね。
実際のところ
StringIO.new("str_hoge_fuga").each("_").to_a
とやると、
[ [0] "str_", [1] "hoge_", [2] "fuga" ]
てな回答が返ってきます。
文字列切り出しまわり
str
#"sample\nstring\n\n\nthis\nis\na\npen\n\nas you like\n"
てな文字列があったとします。
この時、eachになにも指定しなければ行ごとの切り出しです。
StringIO.new(str).each.to_a [ [0] "sample\n", [1] "string\n", [2] "\n", [3] "\n", [4] "this\n", [5] "is\n", [6] "a\n", [7] "pen\n", [8] "\n", [9] "as you like\n" ]
一方、空文字列を指定してあげると……センテンス区切りになります。
StringIO.new(str).each("").to_a [ [0] "sample\nstring\n\n", [1] "this\nis\na\npen\n\n", [2] "as you like\n" ]
*1:あくまで個人的感想