On 27/09/2011 23:38, Yui NARUSE wrote:
>
> Issue #5372 has been updated by Yui NARUSE.
>
>
> This seems the long discussed question, what is a zero element.
> But I don't think this proposal is not worth breaking ActiveSupport's blank?.

True, that would be unfortunate.  For that reason I marginally prefer 
the null? name but thought blank? would be a more familiar concept.

>
> Anyway what is the usecase of this?

In the short term, it saves accidentally missing bugs where I forget to 
complete the type check.  It's an addition which is simple to implement 
(at least naively) and does not break existing code, and would make my 
projects a little bit simpler.

Longer-term, I think it's an interesting primitive. It gives an 
alternative approach to being able to subclass FalseClass or NilClass, 
which is also occasionally suggested.  One use case for this is in 
implementing non-exception error classes, which would give you something 
a little like Haskell's Either.

> I doubt a closed io is a zero element.
> Do you have a case that you are happy if it is a zero element.

Yes, if it's set to autoclose. I'm not wedded to the definition on IO, 
though - if you think there's a more useful one then I'm all ears.

-- 
Alex

> ----------------------------------------
> Feature #5372: Promote blank? to a core protocol
> http://redmine.ruby-lang.org/issues/5372
>
> Author: Alex Young
> Status: Open
> Priority: Normal
> Assignee:
> Category: core
> Target version: 1.9.4
>
>
> I don't think there's been a project I've used that hasn't made use of this pattern:
>
>    if thing.nil? || thing.empty?
>
> somewhere in its source.  This is necessary because it is idiomatic to return nil where other languages might return a null object, and there is no universal test for nullity which a user-implemented class can provide without issues.
>
> Facets (and ActiveSupport) define a #blank? protocol which allows for the above to be replaced with:
>
>    if thing.blank?
>
> Being able to type this on a first iteration saves forgetting one of the cases and having to come back to fix a bug later.  For projects where I cannot directly use Facets or ActiveSupport, I always find that I rewrite a version for myself.  It would be very convenient not to have to do this every time, and this is clearly a common case, so I propose that #blank? be implemented on the following classes:
>
>    Object: to return false
>    String: aliased to #empty?
>    NilClass: to return true
>    TrueClass: to return false
>    FalseClass: to return true
>    Array: aliased to #empty?
>    Hash: aliased to #empty?
>    Fiber: to return !alive?
>    Numeric: aliased to #zero?
>    IO: aliased to #closed?
>    MatchData: to return #to_s.blank?
>    Process::Status: aliased to #exited?
>    Range: to return self.include?(self.begin)
>    Struct: subclass instances to return values.blank?
>    Thread: to return !alive?
>    ThreadGroup: to return list.blank?
>
> Some of these uses aren't described by the word "blank?" very well (and ActiveSupport's String#blank? is somewhat different), so as a sub-feature I'd like to suggest "null?" as an alternative method name.
>
> Apologies if this has been proposed and rejected before, but a quick search of redmine didn't show anything relevant.
>
>