Project

General

Profile

Feature #11717

Object#trap -- pass object to block and return result

Added by zverok (Victor Shepelev) over 4 years ago. Updated about 3 years ago.

Status:
Closed
Priority:
Normal
Assignee:
-
Target version:
-
[ruby-core:71590]

Description

Object#trap can be thought as useful counterpart for Object#tap: like tap, it passes object to the block; unlike tap, it returns results of the block, not object itself.

Rationale

#trap could allow to gracefully chain processing of objects, which isn't Enumerable, therefore enforcing "functional" style in Ruby (which considered good).

Use case

# Assume we grab some resource from web:
SomeWebClient.get('http://some/url', param1: 'value1', param2: 'value2').body

# And now, the body of response is JSON, and we want it parsed. How to express it?

# Option 1: wrap:
JSON.parse(SomeWebClient.get('http://some/url', param1: 'value1', param2: 'value2').body)
# Downside: messy parenthesis, and need to jump back and forth to understand the meaning

# Option 2: intermediate variable:
s = SomeWebClient.get('http://some/url', param1: 'value1', param2: 'value2').body
JSON.parse(s)
# Downside: intermediate variable is not elegant

# Option 3: monkey-patch (or refine)
SomeWebClient.get('http://some/url', param1: 'value1', param2: 'value2').body.from_json
# Downside: monkey-patching is a last resort; also, your classes should be already patched when you stuck with this case

# Option 4 (proposed): trap
SomeWebClient.get('http://some/url', param1: 'value1', param2: 'value2').body.
  trap{|s| JSON.parse(s)} # => parsed JSON

And when you are thinking with code, experimenting with code (especially in irb, but in editor too), only last option is "natural" river of thoughts: do this, then do that (extract data from web, then parse it).

Naming

  • it is similar enough to tap;
  • it is specific enough to not be used widely in some popular library (or isn't it?);
  • mnemonic is "do something and trap (catch) the value".

WDYT?


Related issues

Is duplicate of Ruby master - Feature #6721: Object#yield_selfClosedmatz (Yukihiro Matsumoto)Actions
Has duplicate Ruby master - Feature #12760: Optional block argument for `itself`ClosedActions
Has duplicate Ruby master - Feature #13172: Method that yields object to block and returns resultClosedActions

Also available in: Atom PDF