coalesce 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.md +55 -0
- data/Rakefile +1 -0
- data/coalesce.gemspec +20 -0
- data/lib/bubble-wrap/coalesce.rb +3 -0
- data/lib/coalesce.rb +16 -0
- metadata +67 -0
data/README.md
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# Coalesce
|
|
2
|
+
|
|
3
|
+
## Ruby, as a community, unfairly discriminates against `false`, and it needs to stop.
|
|
4
|
+
|
|
5
|
+
Do you write code like this? `val = maybe_nil || fallback`
|
|
6
|
+
|
|
7
|
+
If so, **you are part of the problem!**
|
|
8
|
+
|
|
9
|
+
`false` is a perfectly non-nil object, and you're excluding it out of convenience!
|
|
10
|
+
|
|
11
|
+
## C#'s ?? operator
|
|
12
|
+
|
|
13
|
+
The null coalescing operator `??` is a C# idiom that provides a concise fallback mechanism for expressions that return `null`.
|
|
14
|
+
|
|
15
|
+
Object maybeObject = null;
|
|
16
|
+
Object fallbackObject = new Object();
|
|
17
|
+
Object obj = maybeObject ?? fallbackObject;
|
|
18
|
+
|
|
19
|
+
In Ruby, we generally write this:
|
|
20
|
+
|
|
21
|
+
maybe_object = nil
|
|
22
|
+
fallback_object = Object.new
|
|
23
|
+
obj = maybe_object || fallback_object
|
|
24
|
+
|
|
25
|
+
However, this idiom is only an approximation, and introduces subtle bugs when we try to allow false values:
|
|
26
|
+
|
|
27
|
+
maybe_val = false # assumed to be a valid value
|
|
28
|
+
fallback_val = 5
|
|
29
|
+
val = maybe_val || fallback_val # => 5, whoops!
|
|
30
|
+
|
|
31
|
+
## Meet the _? method
|
|
32
|
+
|
|
33
|
+
With `coalesce`, you can write this instead:
|
|
34
|
+
|
|
35
|
+
maybe_val = false # assumed to be a valid value
|
|
36
|
+
fallback_val = 5
|
|
37
|
+
val = maybe_val._? fallback_val # => false, like we expected!
|
|
38
|
+
|
|
39
|
+
And if you still need the short-circuiting behavior of the `||` operator, you can pass a block instead:
|
|
40
|
+
|
|
41
|
+
val = maybe_val._? { generate_fallback(data) }
|
|
42
|
+
|
|
43
|
+
## Benefits
|
|
44
|
+
|
|
45
|
+
I've noticed a positive side-effect of using `_?` is that I explicitly call out when I'm counting on the short-circuiting behavior, and that awareness of the short-circuiting behavior is causing me to use it in ways I would never use `||`.
|
|
46
|
+
|
|
47
|
+
For example, using it to assert an object's existence before returning it.
|
|
48
|
+
|
|
49
|
+
def give_me_the_data
|
|
50
|
+
@data_finder.try_to_find_data._? { raise "Oh no, we suck at finding data!" }
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
I probably wouldn't think to use a `||` there, and it might look weird, especially with a more complex expression.
|
|
54
|
+
|
|
55
|
+
And, of course, I'm grateful to be reunited with my long lost friend, `false`.
|
data/Rakefile
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
require 'bundler/gem_tasks'
|
data/coalesce.gemspec
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
|
|
3
|
+
Gem::Specification.new do |gem|
|
|
4
|
+
gem.name = 'coalesce'
|
|
5
|
+
gem.description = "Adds a nil-coalescing method to Ruby, similar to C#'s ?? null-coalescing operator"
|
|
6
|
+
gem.homepage = "https://github.com/kibiz0r/#{gem.name}"
|
|
7
|
+
gem.version = '0.0.1'
|
|
8
|
+
|
|
9
|
+
gem.authors = ['Michael Harrington']
|
|
10
|
+
gem.email = ['kibiz0r@gmail.com']
|
|
11
|
+
|
|
12
|
+
gem.files = `git ls-files`.split($\)
|
|
13
|
+
gem.require_paths = ['lib']
|
|
14
|
+
|
|
15
|
+
gem.summary = <<-END.gsub(/^ +/, '')
|
|
16
|
+
foo || bar is a nice idiom for returning bar if foo is nil. Unfortunately, it also returns bar if foo is false.
|
|
17
|
+
foo._? bar is a clean alternative that respects false values.
|
|
18
|
+
foo._? { bar } allows you to keep the short-circuiting behavior of the || operator.
|
|
19
|
+
END
|
|
20
|
+
end
|
data/lib/coalesce.rb
ADDED
metadata
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: coalesce
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
prerelease: false
|
|
5
|
+
segments:
|
|
6
|
+
- 0
|
|
7
|
+
- 0
|
|
8
|
+
- 1
|
|
9
|
+
version: 0.0.1
|
|
10
|
+
platform: ruby
|
|
11
|
+
authors:
|
|
12
|
+
- Michael Harrington
|
|
13
|
+
autorequire:
|
|
14
|
+
bindir: bin
|
|
15
|
+
cert_chain: []
|
|
16
|
+
|
|
17
|
+
date: 2012-09-11 00:00:00 -04:00
|
|
18
|
+
default_executable:
|
|
19
|
+
dependencies: []
|
|
20
|
+
|
|
21
|
+
description: Adds a nil-coalescing method to Ruby, similar to C#'s ?? null-coalescing operator
|
|
22
|
+
email:
|
|
23
|
+
- kibiz0r@gmail.com
|
|
24
|
+
executables: []
|
|
25
|
+
|
|
26
|
+
extensions: []
|
|
27
|
+
|
|
28
|
+
extra_rdoc_files: []
|
|
29
|
+
|
|
30
|
+
files:
|
|
31
|
+
- README.md
|
|
32
|
+
- Rakefile
|
|
33
|
+
- coalesce.gemspec
|
|
34
|
+
- lib/bubble-wrap/coalesce.rb
|
|
35
|
+
- lib/coalesce.rb
|
|
36
|
+
has_rdoc: true
|
|
37
|
+
homepage: https://github.com/kibiz0r/coalesce
|
|
38
|
+
licenses: []
|
|
39
|
+
|
|
40
|
+
post_install_message:
|
|
41
|
+
rdoc_options: []
|
|
42
|
+
|
|
43
|
+
require_paths:
|
|
44
|
+
- lib
|
|
45
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
46
|
+
requirements:
|
|
47
|
+
- - ">="
|
|
48
|
+
- !ruby/object:Gem::Version
|
|
49
|
+
segments:
|
|
50
|
+
- 0
|
|
51
|
+
version: "0"
|
|
52
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
53
|
+
requirements:
|
|
54
|
+
- - ">="
|
|
55
|
+
- !ruby/object:Gem::Version
|
|
56
|
+
segments:
|
|
57
|
+
- 0
|
|
58
|
+
version: "0"
|
|
59
|
+
requirements: []
|
|
60
|
+
|
|
61
|
+
rubyforge_project:
|
|
62
|
+
rubygems_version: 1.3.6
|
|
63
|
+
signing_key:
|
|
64
|
+
specification_version: 3
|
|
65
|
+
summary: foo || bar is a nice idiom for returning bar if foo is nil. Unfortunately, it also returns bar if foo is false. foo._? bar is a clean alternative that respects false values. foo._? { bar } allows you to keep the short-circuiting behavior of the || operator.
|
|
66
|
+
test_files: []
|
|
67
|
+
|