Hello,
I'm surprised to see that this result:
"".split("\n") # => [""]
Shouldn't the result of the split an empty array ? (cf: Ruby's behaviour)
But on JavaScript:
console.log(''.split('')) // => []
console.log(''.split('\n')) // => ['']
On Crystal, "".split (without argument) returns [], so I think it is a bug.
Related issue: #1070
No, I don't think it is not a bug. For example, " foo ".split returns ["foo"], in other words String#split without argument ignores leading and trailing spaces, so this behavior is natural. However, the name String#split does not make sense. I think String#words is better for this behavior.
I think no separator versionString#split behavior is corresponding to %w syntax.
The behavior is correct. When you split, you text existing pieces and try to find a delimiter. If no delimiter is found, the original string is returned in the result.
Ruby removes blank results and it's a bit confusing. In #1070 there was a discussion about it.
split without arguments splits on whitespace (any amount of it) and removes empty strings, so "".split will return an empty array. And I don't think we should rename it to words. We just need to document it better, that's it.
@asterite Thank you for answer. I'll close #4646.
@asterite Could you explain why you don't think we should rename String#split to words? (I guess it is breaking-change.) If possible, I abandon #4646 perfectly.
I actually think words is better than split. But I'm a bit tired of taking these micro-decisions, doing breaking changes, etc.
In fact, I will have very little time to dedicate to Crystal from now on, so I shouldn't have commented anything. It's better to target other core team members. Sorry...
In fact, I will have very little time to dedicate to Crystal from now on
:O
After re-reading this, we can probably:
String#split as it is now (String#works isn't good, because a piece might end up being something like "::%" which isn't a word, like, a word in a language)String#split(...) to remove empty results.The behavior is correct. When you split, you text existing pieces and try to find a delimiter. If no >delimiter is found, the original string is returned in the result.
That is crappy behavior and not Ruby-like. For example "1234".split('') in Ruby returns nice ['1','2','3','4'] why doesn't Crystal??
Because this isn't Ruby and you can just do "1234".chars # => ['1', '2', '3', '4'] to get the same result.
Also "1234".split("") # => ["1", "2", "3", "4"]. I'm not sure what the issue is here?
#chars returns an Array(Char), while the split("") returns an Array(String).
Most helpful comment
I actually think
wordsis better than split. But I'm a bit tired of taking these micro-decisions, doing breaking changes, etc.In fact, I will have very little time to dedicate to Crystal from now on, so I shouldn't have commented anything. It's better to target other core team members. Sorry...