2012-06-27 15 views
5

Ruby 1.9.3では、RubyのString#splitメソッドが特定の結果をもたらす理由を理解しようとしています。私が得ている結果は、私が期待しているものとは逆の直観に見える。ここに例があります: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番目の例が長さゼロの文字列を最初の値として返す場合、最後の例は最後の値と同じ値を返さなければなりません。

私には何が欠けていますか?

EDIT:これをもっと見ると、なぜこれがデフォルトの動作であり、なぜ私の考えが完全に間違っているのかがわかります。たとえば、CSVファイルを調べる場合、各列を分割すると、空の先頭の列が無視されるため、データが破棄されます。

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

+0

CSVをコンマで区切ってはいけません。引用符で囲まれた文字列にカンマが埋め込まれていると、結果が悪くなります。代わりに、Rubyの組み込みのCSVモジュールを使用してください。これは正しいことです。 –

+0

@ the tin man:わかりました、私は一般的に話していました。ありがとう! – Threeve

答えて

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

コンマで区切っているとします。 ",bc,bc".split(',')からどのような動作が期待できますか?それは 'a'で分割することで違いはありません。 3番目の例では、splitはデフォルトで末尾空白を省略しています。限界パラメータが省略された場合

+0

コンマで分割すると、 '[" bc "、" bc "]'の結果が期待されると思います。しかし、CSVファイルの仕組みについて考え始めると、先行する空の文字列を完全に無視すると不正確な結果につながるので、私は今「なぜ」を理解しています。 – Threeve

5

ruby 1.9 documentationはヌルフィールドが抑制され、末尾、

言います。だから、

私たちはあなたの例取る場合:

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

を我々は限界値が含ま:あなたが期待される動作を取得

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

を。

関連する問題