"eles" <e...@eles.com> wrote in message news:is2qgc$2o7h$1...@digitalmars.com... >> The right boundary of a slice is exclusive. > > I think it should be stated more obvious in the paper. > >> This makes sense, so you can >> do stuff like a[1..$] (== a[1..a.length]) to get a slice that > contains >> all elements of a except for the first one (a[0]). > > I disagree, but I have not much influence here, although I will > defend my point of view. I find it quite unpleasant to remember which > of the left and right bounds are exclusive and, moreover, this > precludes slicing with a[i1..i2] where i1 and i2 are only known at > the runtime and may be i2<i1 (and not necessarily i1<i2). >
When I first started with D, ages ago, I was skeptical about the half-open slices. It sounded unbalanced. But since then, I've been won over by it for a few reasons (in no particular order): 1. After years of using D, I've never had a problem with it working that way. And even initially, I found it very easy to learn and get used to it. 2. I've found it easier to avoid off-by-one errors. I don't have to think about them as much. 3. arr[a..b].length == b-a <-- That's a *very* nice, clean, useful property to have. And I think it's one of the main reasons for #2 above. In fact, this actually makes it feel more balanced to me than having inclusive on both ends. 4. The following: string str = "ABCDEF"; int splitIndex = 3; string part1 = str[0 .. splitIndex]; string part2 = str[splitIndex .. $]; assert(part1 ~ part2 == str); Ie, when you split an array, you can use the same index for both halves. No "+1"-ing. It just works. Don't have to think about it.