Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

StringIO#eachには、FSっぽい感じで文字列を切り分ける機能がある

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:あくまで個人的感想