Project

General

Profile

Actions

Feature #5372

closed

Promote blank? to a core protocol

Added by regularfry (Alex Young) about 13 years ago. Updated over 12 years ago.

Status:
Rejected
Target version:
[ruby-core:39740]

Description

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.

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0