How do you safely deal with range.front?
aliak
something at something.com
Sat Dec 30 19:11:20 UTC 2017
On Friday, 29 December 2017 at 20:33:22 UTC, Jonathan M Davis
wrote:
> Well, I don't know what you're really doing in code here, but
> in general, you'd write your code in a way that it checks empty
> and simply doesn't try to do anything with front if the range
> is empty.
Yes, ideally, if programmers were perfect, this would work. The
same applies to always checking null before dereferencing a
pointer. You can of course try and make sure you always do check
first. Or you can provide a safe way to do it in cases where you
only want to dereference a pointer if the pointer is not null.
Granted in some situations you want to crash as well because it
would indeed be a bug if a pointer was null (or a range was
empty).
Btw, it seems that phobos, or at lest some of it, has an
assert(!empty, "Attempting to fetch the front of an empty
filter."). I guess probably it's not everywhere so hence the
weird behavior you say happens sometimes :( ... ah well.
> You could wrap the range in a range that specifically returns
> some default element when the wrapped range is empty, meaning
> that the range would then be infinite.
>
> You could just use a wrapper function to call front and have it
> return a Nullable or a default value if the range is empty, but
> that wouldn't work when passing the range to other functions.
>
> You could also do something like an infinite range that simply
> returns the same value forever no matter how often front gets
> popped, and then you could use chain to combine your range and
> that range into a single range that would iterate through your
> range and then give the same element forever.
>
> Regardless, you'll have to be careful of any solution that
> involves creating an infinite range, since while some
> algorithms will be fine with it, others will either not compile
> or result in an infinite loop (e.g. don't use foreach on it).
>
True, having to deal with infinite ranges will add to number of
cases I'd have to worry about. Would prefer not to of course.
I'm going to explore the Nullable approach you mentioned a bit me
thinks !
Also, I found this now:
https://forum.dlang.org/post/fshlmahxfaeqtwjbjouz@forum.dlang.org
. Seems to be what I'm looking for!
> Regardless, if you want to return an element when there isn't
> one, you're going to have to come up with a value for that.
> It's not something that's really going to work well generically.
The generic constructs would occur ideally before accessing
front. If not then yes, you're correct. Passing a "safeFront", or
any other non-range value further down the pipeline would need a
an undo function the other end of the pipeline.
More information about the Digitalmars-d-learn
mailing list