5

Ruby 1.9.3(およびおそらく以前のバージョンではわかりません)では、RubyのString#splitメソッドが特定の結果をもたらす理由を理解しようとしています。私が得ている結果は、私が期待するものとは直感に反しているように見えます。次に例を示します。

"abcabc".split("b") #=> ["a", "ca", "c"]
"abcabc".split("a") #=> ["", "bc", "bc"]
"abcabc".split("c") #=> ["ab", "ab"]

ここで、最初の例は私が期待するものを正確に返します。

しかし、2番目の例では、#splitが返された配列の最初の値として長さゼロの文字列を返す理由について混乱しています。これの理由は何ですか?これは私が代わりに期待するものです:

"abcabc".split("a") #=> ["bc", "bc"]

そして、同じ線に沿って、3番目の例で末尾のゼロ長の文字列が返されないのはなぜですか?2番目の例が最初の値として長さゼロの文字列を返す場合、最後の例は最後の値と同じものを返す必要があります。

私を啓発してください、私はここで何が欠けていますか?

編集:詳しく調べてみると、これがデフォルトの動作である理由と、私の考え方が完全に間違っている理由がわかります。たとえば、CSVファイルを調べて各列を分割すると、空の先頭の列が無視されるため、データが破棄されます。

また、この質問はRubyだけに関連しているわけではないことに注意することも重要です。私は、他の多くの言語がまったく同じように動作することを学んでいます。これを知ったとき、私は単にRubyを使用していました。

4

2 に答える 2

5

ruby1.9のドキュメントには

limitパラメーターを省略した場合、末尾のnullフィールドは抑制されます。

したがって、あなたの例をとると:

 "abcabc".split("a") #=> ["bc", "bc"]

そして、制限値を含めます。

 "abcabc".split("a", -1)  #=> ["ab", "ab", ""]

期待どおりの動作が得られます。

于 2012-06-27T20:38:10.913 に答える
4
"abcabc".split("b") #=> ["a", "ca", "c"]
"abcabc".split("a") #=> ["", "bc", "bc"]
"abcabc".split("c") #=> ["ab", "ab"]

カンマで分割していたとします。どのような行動を期待し ",bc,bc".split(',')ますか?'a'で分割しても違いはありません。3番目の例でsplitは、デフォルトで末尾の空を省略します。

于 2012-06-27T20:36:47.490 に答える