ツイートしたりもしたけど、やはり気になるのでつらつらとポエムる。
strings.TrimLeftわかりづらくね?
golangのstrings.TrimLeft
(Right
)とstrings.TrimPrefix
(Suffix
)の関係が嫌い。
TrimLeft
の方は概念的にはTrimLeft(s string, cutset set<rune>)
のはずなのに、TrimLeft(s string, cutset string)
となってる。
結果、型としてはTrimLeft(string, string)
とTrimPrefix(string, string)
は見分けがつかない。
Prefix
の存在を知らないとTrimLeft("abc-back", "abc-")
とか書かれてたときに想像する結果が二通りに分岐してしまう。 正解は"k"
なわけだけど、"back"
かな、と思っちゃう場合もある。というかgolangを2年触ってる僕だってそう思う。
すべての関数は型で中身が想像できるべきだ!なんて1ミリも思わないけど、こればっかりはわかりづらすぎないか?
じゃあどうするか
golangにはset<T>
がない(と言うかジェネリクスないし)わけだけど、代わりに何使うか。
形式的にはmap[T]struct{}
とか定番だけど、
strings.TrimLeft("abcback", map[rune]struct{}{
'a':struct{}{},
'b':struct{}{},
'c':struct{}{}
})
悍ましくて書きたくない。
結局、array
じゃね?ということで、strings.TrimLeft(string, []rune)
としてほしい。
結局stringと似た何かなんだけど、配列はシーケンシャルであると同時に集合としてのニュアンスを(stringよりは)持つと思うんだよね。
2に期待
golang 2でstrings.TrimLeft(string, []rune)
への変更が為されないかと密かに期待している。
RFC書きたいけど、議論が紛糾しそうで、そんな場に英語で参戦する勇気が出ない。