2013-12-14 2 views
14

コード'////'.split('/')の結果は[]となります。私はそれが['', '', '', '', '']であると予想していましたが。これがルビーの機能であれば、どうしてそんなにデザインされていますか?なぜ '////'.split('/')が[]を生成するのですか?

+0

+1良い質問をしています: –

+2

質問は面白いですが、尋ねられたかもしれない最高の形ではありません。あなたの質問は、この効果のために4つの連続するスラッシュが重要であることを読者に誤解させるかもしれませんが、そうではありません。短いスラッシュシーケンスで同じ結果が得られます。 – sawa

答えて

3

このデザインは、後続の区切り文字で文字列を解析するのに便利です。たとえば、

'1␣2␣3␣␣'.split('␣')['1', '2', '3', '', '']ではなく['1', '2', '3']となります。

この機能はワークフローを簡略化するためのものです。

しかし、私はこのメソッドの純度を壊すので、この機能が嫌いです。上記の効果を達成するためには、'1␣2␣3␣␣'split('␣')の間に特別なrstrip('␣')が必要です。

+8

'( '␣')'がかわいいです。 –

17

デリミタの文字列を区切り文字で分割することはできません。

あなたはヌルフィールドが抑制され、末尾、limitパラメータが省略されている場合

'////'.split('/',-1) 
=> 
["", "", "", "", ""] 

この動作を実現するために機能を分割する2番目のパラメータとしての限界を渡す必要があります。 limitが正の数である場合、最大で数のフィールドが返されます(limitが1の場合、文字列全体が配列内の唯一のエントリとして返されます)。負の場合、返されるフィールドの数に制限はなく、末尾のnullフィールドは抑制されません

+2

* + 1 * ..私は... :)しかし、あなたは[doc](http://www.ruby-doc.org/core-2.0.0/String.html#methodi- split)like - ** limitパラメータを省略すると、末尾のnullフィールドは抑制されます**。 limitが正の数である場合、最大で数のフィールドが返されます(limitが1の場合、文字列全体が配列内の唯一のエントリとして返されます)。 **負の場合、返されるフィールドの数に制限はなく、末尾のnullフィールドは抑制されません。** –

+0

ありがとうございます。本当に便利なコメント。 – SergeyKutsko

10

splitの動作の調査は、最適化の結果であることを示しています。

'////'.split('/') 
=> [] 

'//a//'.split('/') 
=> ["", "", "a"] 
関連する問題