digitalmars.D.learn - Taking a slice of a string: Correct behavior?
- bachmeier (16/16) Aug 11 2023 I'm trying to understand why this code returns an empty string
- Steven Schveighoffer (26/47) Aug 11 2023 In a slicing operation, the second index is one index *beyond* the data
- Salih Dincer (5/10) Aug 11 2023 Something goes wrong is indeed a 2nd degree problem. The
I'm trying to understand why this code returns an empty string
rather than an out of bounds error:
```
writeln("this"[4..$]); // Empty string
```
But
```
writeln("this"[4]);
```
won't compile. I thought maybe it had something to do with the
`$` or the `..` operator, but `"this"[4..4]` compiles and runs
while `"this"[5..5]` does not. Therefore it's not the fact that
there are no elements in the slice.
On the other hand, `"this"[3..3]` also returns an empty string.
That still doesn't explain why there is no out of bounds error
for `"this"[4..4]`.
Aug 11 2023
On 8/11/23 12:04 PM, bachmeier wrote:
I'm trying to understand why this code returns an empty string rather
than an out of bounds error:
```
writeln("this"[4..$]); // Empty string
```
But
```
writeln("this"[4]);
```
won't compile. I thought maybe it had something to do with the `$` or
the `..` operator, but `"this"[4..4]` compiles and runs while
`"this"[5..5]` does not. Therefore it's not the fact that there are no
elements in the slice.
On the other hand, `"this"[3..3]` also returns an empty string. That
still doesn't explain why there is no out of bounds error for
`"this"[4..4]`.
In a slicing operation, the second index is one index *beyond* the data
you are looking to slice. In other words, the upper bound is *exclusive*
of the data.
The data looks like this:
```
data: [ t h i s ]
index: 0 1 2 3 4
```
So "this"[1 .. 3] will do it like this:
```
data: [ t h i s ]
index: 0 1 2 3 4
slice: [h i ]
```
If you slice 4 .. 4, then you get:
```
data: [ t h i s ]
index: 0 1 2 3 4
slice: []
```
This is allowed, because the pointer is still within bounds of the array.
If you slice 5 .. 5, that is out of bounds of the entire array, and even
though you aren't getting any data, the pointer will point beyond the
scope of the array, and isn't allowed.
-Steve
Aug 11 2023
On Friday, 11 August 2023 at 16:04:21 UTC, bachmeier wrote:
I'm trying to understand why this code returns an empty string
rather than an out of bounds error:
```d
writeln("this"[4..$]); // Empty string
```
Something goes wrong is indeed a 2nd degree problem. The
important thing is that slicing a string might be wrong if it
contains UTF.
SDB 79
Aug 11 2023









Steven Schveighoffer <schveiguy gmail.com> 