4 ms·
Counter-example: You have to remove all desks from #20 to #30, how many desks are there? Oh, it's 11 desks, I see. This is because we used INCLUSIVE indexing,
by iopq 4y ago
Counter-example:
You have to remove all desks from #20 to #30, how many desks are there?
Oh, it's 11 desks, I see. This is because we used INCLUSIVE indexing, instead of semi-open interval.
If we use semi-open intervals, we don't include the last item, so that we can write
match index {
0..10 => println!("first ten"),
10..20 => println!("next ten"),
_ => println!("something else"),
}
but this forces us to start our intervals at 0, otherwise we would have to write 1..11 which would be awkward
- maxdamantus 4y agoIndeed. End exclusion is advantageous because we don't need to add or subtract 1 when constructing or interpreting ranges. Forgetting to add or subtract 1 is basically why off-by-one errors exist (and doing add rather than subtract or vice versa is probably why off-by-two errors exist). `a..(a+n)` is an n-length range, not an (n + 1)-length range (oh look, an "add 1" operation!). And an empty range is denoted by `a..a`, not `a..(a-1)` (oh look, a "subtract 1" operation!).
- gernb 4y agodoesn't swift use inclusive indexing? 1...10 includes 10
- maxdamantus 4y agoHaven't used Swift, but looking at the documentation, it seems to support `...` for end-inclusive and `..<` for end-exclusive. Looking at the Swift standard library, end-exclusive ranges seem to be far more commonly used: ~/build/swift$ git grep -e '\.\.< *[a-zA-Z0-9_(]' --and --not -e '^ *//' -- stdlib/\*.swift | wc -l 599 ~/build/swift$ git grep -e '\.\.\. *[a-zA-Z0-9_(]' --and --not -e '^ *//' -- stdlib/\*.swift | wc -l 112