7
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

golangのstrings.TrimLeftはイケてない

Posted at

ツイートしたりもしたけど、やはり気になるのでつらつらとポエムる。

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書きたいけど、議論が紛糾しそうで、そんな場に英語で参戦する勇気が出ない。

7
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?