<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body dir="auto"><div>Hi Duncan, if you want your class to be comparable with other built-in objects, I think you need to implement any #to_* methods that make sense.</div><div><br></div><div>I think you need to write a #to_date method which with then automatically be coerced when the comparison is done starting with a Date object. </div><div><br>Sent from my iPhone</div><div><br>On 15 Jul 2015, at 13:04, Duncan Stuart <<a href="mailto:dgmstuart@gmail.com">dgmstuart@gmail.com</a>> wrote:<br><br></div><blockquote type="cite"><div><div dir="ltr">Sorry that last code snippet should be:<br><p style=""><span style="font-size:12.8000001907349px">def sort_by_expected_date<br></span><span style="font-size:12.8000001907349px">  sort do |a, b| <br></span><span style="font-size:12.8000001907349px">    if b.class = NoExpectedDate <br></span><span style="font-size:12.8000001907349px">      1<br></span><span style="font-size:12.8000001907349px">    else<br></span><span style="font-size:12.8000001907349px">      a <=> b<br></span><span style="font-size:12.8000001907349px">    end<br></span><span style="font-size:12.8000001907349px">  end<br></span><span style="font-size:12.8000001907349px">end</span></p></div><div class="gmail_extra"><br><div class="gmail_quote">On 15 July 2015 at 13:03, Duncan Stuart <span dir="ltr"><<a href="mailto:dgmstuart@gmail.com" target="_blank">dgmstuart@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Hi LRUG - hopefully an interesting little problem:<br><br>I have an Event class which has an "expected_date" attribute.<br>Some events don't have an expected date, so like a good little OO programmer i've created a Null object:<br><br><div>class NoExpectedDate</div><div>  def to_s(format=:default)</div><div>    "Unknown"</div><div>  end</div><div>end</div><div><br></div><div>This works great for printing the values, but when it comes to sorting the list I of course get:<br>




   ArgumentError: comparison of Date with NoExpectedDate failed <br><br>If I include Comparable and define <=> then one comparison works, but the other doesn't :<br><br><div>class NoExpectedDate</div><div>  include Comparable</div><div>  def to_s(format=:default)</div><div>    "Unknown"</div><div>  end</div><div>  def <=>(other_date)</div><div>    1 # Treat it as after every other date</div><div>  end</div><div>end</div></div><div>







<p><span>$ </span><span>NoExpectedDate</span><span>.new > </span><span>Date</span><span>.today<br></span><span>=> </span><span>true</span></p>
<p><span>$ </span><span>Date</span><span>.today > </span><span>NoExpectedDate</span><span>.new<br></span>ArgumentError: comparison of Date with NoExpectedDate failed<br><br>I think this is because Date's <=> method expects it's argument to be a Date object or a number ("a numeric value as an astronomical Julian day number"). I've tried defining to_i and to_r on NoExpectedDate, but no dice.<br><br>Can I get NoExpectedDate to pretend to be a Date (like SimpleDelegator lies about it's class)? Is that evil?<br><br>I suppose I could always just define a method on Event to do this particular sort, but that seems nasty for all sorts of reasons:<br><br></p><p>def sort_by_expected_date sort do |a, b| </p><p>    if b.class = NoExpectedDate </p><p>      1</p><p>    else</p><p>      a <=> b</p><p>    end</p><p>  end</p><p>end</p><p><br></p></div></div>
</blockquote></div><br></div>
</div></blockquote><blockquote type="cite"><div><span>_______________________________________________</span><br><span>Chat mailing list</span><br><span><a href="mailto:Chat@lists.lrug.org">Chat@lists.lrug.org</a></span><br><span>Archives: <a href="http://lists.lrug.org/pipermail/chat-lrug.org">http://lists.lrug.org/pipermail/chat-lrug.org</a></span><br><span>Manage your subscription: <a href="http://lists.lrug.org/options.cgi/chat-lrug.org">http://lists.lrug.org/options.cgi/chat-lrug.org</a></span><br><span>List info: <a href="http://lists.lrug.org/listinfo.cgi/chat-lrug.org">http://lists.lrug.org/listinfo.cgi/chat-lrug.org</a></span><br></div></blockquote></body></html>