空文字列をsplitしたらどうなる?

8
一二三 四五六 @gh123or456

カンマだけ渡したなら空文字入り長さ2の配列で返したいから、この場合長さ1で返すかな。 めっちゃ悩んだけども。 twitter.com/wonderful_pand…

2021-06-21 23:51:57
いわた @wonderful_panda

投票とってみるか。 「与えられた文字列をカンマでsplitした結果を配列で返す」というメソッドがあるとして、空文字列を指定した結果は

2021-06-21 14:46:03
えびじゃがりこ @BoFkbpf

最近触ってるのはもっぱらPHPだから普通に考えたら先頭要素に空文字入った配列返るんじゃね?と思ったけど そうでもないパターンもあんのね まぁこの手の関数使う時は VBAにしてもC#にしても 毎回どんな挙動だっけなってド忘れしてググッて使う事が多いけど twitter.com/wonderful_pand…

2021-06-21 23:56:14
Liberdade @LiberJP

2500超えてるのに真っ二つたのワロタ perl脳のワイ、[] が返ってくるなと思って0に投票したが、一貫性のある動作を求めるなら [‘’] になるのが自然だから1が多そう思ったので結果にびびる twitter.com/wonderful_pand…

2021-06-22 00:04:05
KowerKoint2010 @KowerKoint2010

完全に半々なのすごい どっちの気持ちもわかる 普通に考えて1だろと最初思ってたけど空白区切りの場合は連続する空白の間の空文字列なんて取り出してほしくないからその理屈で行くと0っぽいんだよな… "".split()は0 "".split(",")は1 であって欲しい twitter.com/wonderful_pand…

2021-06-22 00:09:25
齊藤敦志 @SaitoAtsushi

一貫性で解釈しがちなプログラマ的な思考だと 1 になるのが自然 (カンマの数に 1 を足した数の要素が存在するのだからカンマが 0 個なら要素数は 1 個) だけれど、自然言語的な解釈だと要素数が 0 個になるのも全く理不尽というわけでもないと思えてしまう。 人間のバグ。 twitter.com/wonderful_pand…

2021-06-22 00:11:21
ナルミンチョ @naru_mincho

この話 昔言っていた 1以上の長さを返すということを型レベル ( (a, List a) ) で表現するのがわかりやすいので, Definyの標準ライブラリはこうしたい twitter.com/naru_mincho/st… twitter.com/wonderful_pand…

2021-06-22 05:02:52
ナルミンチョ @naru_mincho

JavaScriptとか多くの言語で "".split(",")が[""]になりこの動作を忘れやすい。 だから、Definyでは ・出力の長さが1つ以上 ・セパレーターの長さは1以上 ・Listでもできる を表現するために型を List.split : (a, List a) → List a → (List a, List (List a))にしよう

2019-05-14 21:11:56
H. NOMATA @hiromichinomata

@mattn_jp @wonderful_panda Pythonはセパレーターで挙動変わるかもしれません pic.twitter.com/rqKZ7S1pfB

2021-06-22 07:27:24
拡大
mattn @mattn_jp

@hiromichinomata @wonderful_panda Ruby はも limit=-1 で(僕の)期待通りになるぽいです。

2021-06-22 10:28:17
いわた @wonderful_panda

@mattn_jp @hiromichinomata えーー(limitは最大分割数の制限にのみ使うべきだと思うので末尾の空白を取り除くかどうかの指定も兼ねるのは長さ0の配列を返すことよりも許しがたい)

2021-06-22 10:43:19
いわた @wonderful_panda

@mattn_jp @hiromichinomata というかrubyのsplit(limit指定なし)って「末尾の空文字列を取り除く」だから、空文字列に限らず ",,,".split(",") とかも [] になるんですね。 ちょっと勘違いしてました。

2021-06-22 10:51:49
Akinori Ito @akinori_ito

改訂版 空文字列をsplitした結果→ 空リスト派: Perl, Ruby, R, D, Go, Tcl, Julia 空文字列のリスト派: JavaScript, Python, Java, Kotlin, C#, Rust, Crystal

2021-06-22 12:50:05
いわた @wonderful_panda

長さ0がわずかにリードで終了しました。正直意外。 twitter.com/wonderful_pand…

2021-06-22 15:28:23
ふみ (DJ Monad) @fumieval

split(xs) + split(ys) = split(xs + "," + ys)が成り立つようにするにはsplit("") = [""]であるべきだが、どうやら[]が優勢らしい twitter.com/wonderful_pand…

2021-06-22 15:29:02
いわた @wonderful_panda

引用RTでは圧倒的に長さ1派が優勢、かつ「長さ0はありえない」みたいな調子の言及も多いので、長さ1派の方がプログラマー経験が長くて自分の意見に自信を持っているみたいな傾向はありそう

2021-06-22 15:32:27
いわた @wonderful_panda

意外ではあるけど面白い結果が出たので満足です

2021-06-22 15:33:32
WHWHWH @whwhwh

おもしろい。PerlやRubyは0だが仕様として特別扱いの記述がある。1になるものは、区切りが対象文字列に存在しない場合は分割できないのでそのまま、という一般的解釈に則っているんだと思う。 twitter.com/wonderful_pand…

2021-06-22 16:02:18
Yusuke Endoh @mametter

"".split(",") の挙動の件、UNIXやシェルでは「空白区切りの文字列」で「文字列の配列」を表現することが(今でも)広く行われていて、この世界観では空文字列は空配列に自然に相当するためではないか、とRubyの大先輩方に教えてもらって納得した pic.twitter.com/TLmHklCT78

2021-06-24 15:02:54
拡大
Akinori MUSHA @knu

RubyのsplitはPerl→awk→shへと遡るもので、任意個の連続したホワイトスペースを区切りとする分かち書き文字列から単語を切り出す機能として生まれ、区切り文字の指定はオプショナル。Cのstrtok(3)も空文字列および区切り文字のみの文字列はトークンなしと見なすので、Unixの慣習ですね。 twitter.com/mametter/statu…

2021-06-24 15:23:03