Feature #21435
Updated by Alexander.Senko (Alexander Senko) 2 days ago
When chaining, I need sometimes to apply some changes conditionally, like this: ```ruby @record = Record.find(record_id) .then { it.respond_to?(:decorate) ? it.decorate : it } ``` It would be great to DRY it a bit: ```ruby @record = Record.find(record_id) .optional { it.decorate if it.respond_to? :decorate } ``` Or, even shorter for Rails users: Reference implementation: ```ruby @record = Record.find(record_id) .optional { it.try :decorate } ``` The intent is to **make it visible at a glance that a statement _may_ affect the result**, but not necessarily does so. Without the proposed method, one needs to read and parse the whole block to know that. It should help to read longer processing chains, for those who prefer chains and `#then` to plain old iterative approach. ## Naming It is discussible. I have just two ideas yet: - `optional` - `maybe` ## Reference implementation ```ruby # Yields self to the block and returns the result of the block if it’s # truthy, and self otherwise. def optional tap do result = yield(self) or next break result end end ``` The name is discussible.