Misleading DateTime comparison

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

Misleading DateTime comparison

Nate Sullivan
I think the most natural way read the code created_at < 10.minutes.ago is "created_at is less than ten minutes ago," but that reading suggests the mistaken interpretation that created_at is fewer than ten minutes ago. The correct interpretation is that created_at is earlier than ten minutes ago. Is there a better way to write the same comparison?

I've thought of three potential improvements so far:
  • 10.minutes.ago > created_at  This "Yoda condition" style doesn't have a translation into ordinary English that tempts you into misunderstanding. But Yoda conditions are inconsistent with the rest of the comparisons in my codebase.
  • Time.now > 10.minutes.after(created_at)  This is another style of Yoda condition. This one allows people who misread the operator (as "more than ten minutes after created_at" instead of "later than ten minutes after created_at") to correctly predict the actual behavior, but for the wrong reason.
  • created_at.earlier_than?(10.minutes.ago)  The ordinary English translation (created_at is earlier than ten minutes ago) is correct. But this requires monkeypatching DateTime (or using the human_time gem) to add the earlier_than? method, which I'd prefer not to do.
Is there a better way that avoids Yoda conditionals, monkeypatching and extra gems?

Thanks for the consideration,
Nate

--
You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email to [hidden email].
To post to this group, send email to [hidden email].
To view this discussion on the web visit https://groups.google.com/d/msgid/rubyonrails-talk/b8058e08-6513-4979-b171-3721035464ec%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Misleading DateTime comparison

Colin Law
On 1 December 2017 at 05:49, Nate Sullivan
<[hidden email]> wrote:
> I think the most natural way read the code created_at < 10.minutes.ago is
> "created_at is less than ten minutes ago," but that reading suggests the
> mistaken interpretation that created_at is fewer than ten minutes ago. The
> correct interpretation is that created_at is earlier than ten minutes ago.

It never occurred to me that there is any confusion over this syntax.
created_at is a time, 10 minutes ago is a time, time a < time b is
unambiguous.

Colin

--
You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email to [hidden email].
To post to this group, send email to [hidden email].
To view this discussion on the web visit https://groups.google.com/d/msgid/rubyonrails-talk/CAL%3D0gLtm5q69a0EksV1vCPOSYY3yUrSCt%3DB80RT8iLZwdMKnSg%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Misleading DateTime comparison

Curtis Schofield
In reply to this post by Nate Sullivan
On Thursday, November 30, 2017 at 10:23:02 PM UTC-8, Nate Sullivan wrote:
> I think the most natural way read the code created_at < 10.minutes.ago is "created_at is less than ten minutes ago," but that reading suggests the mistaken interpretation that created_at is fewer than ten minutes ago. The correct interpretation is that created_at is earlier than ten minutes ago. Is there a better way to write the same comparison?
>
>
>

I think the real issue is that English lacks strong typing and so the comparison operater is imprecise.

--
You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email to [hidden email].
To post to this group, send email to [hidden email].
To view this discussion on the web visit https://groups.google.com/d/msgid/rubyonrails-talk/36750827-e607-408b-a394-421d324b2ee1%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.