Exactly. In Crystal map
is Object#try
. As an example, the code presented in the rosettacode for Ruby:
class Maybe
def initialize(value)
@value = value
end
def map
if @value.nil?
self
else
Maybe.new(yield @value)
end
end
end
Maybe.new(3).map { |n| 2*n }.map { |n| n+1 }
#=> #<Maybe @value=7>
Maybe.new(nil).map { |n| 2*n }.map { |n| n+1 }
#=> #<Maybe @value=nil>
Maybe.new(3).map { |n| nil }.map { |n| n+1 }
#=> #<Maybe @value=nil>
Becomes in Crystal:
3.try { |n| 2*n }.try { |n| n+1 }
#=> 7
nil.try { |n| 2*n }.try { |n| n+1 }
#=> nil
3.try { |n| nil }.try { |n| n+1 }
#=> nil
Look ma, no wrapper!