Project

General

Profile

Actions

Feature #20027

closed

Add Range Deconstruction

Added by stuyam (Stuart Yamartino) 6 months ago. Updated 5 months ago.

Status:
Rejected
Assignee:
-
Target version:
-
[ruby-core:115525]

Description

Ranges are a powerful tool in ruby. A common range I use is a date range such as (Date.yesterday..Date.tomorrow). A range will often be passed around to methods because the dates hold meaning together such as a timeframe for a table filter.
Often I want to grab the original values out of a range like:

timeframe = (Date.yesterday..Date.tomorrow)
start_date = timeframe.begin
end_date = timeframe.end

#=> start_date = yesterday
#=> end_date = today

Similar to array and hash deconstruction I thought it would be useful to support range deconstruction like this:

start_date, end_date = (Date.yesterday..Date.tomorrow)

#=> start_date = yesterday
#=> end_date = today

This would also work for endless or beginless ranges since the beginning and end are just nil in those cases:

start_date, end_day = ..Date.tomorrow

#=> start_date = nil
#=> end_date = tomorrow

You could do this now using to_a like:

start_date, *middle_dates, end_date = (Date.new(2000,1,1)..Date.new(2023,1,1).to_a

However this has unnecessary performance issues by converting the range to an array especially if the range spans a large period, middle_dates would hold a very large array. Also if the range resulted in an array with 2 values, end_date would be nil and this wouldn't actually work to get the begin and end values.

I think this provides a simple interface for a common pattern of deconstructing ranges into their beginning and end values. It would be useful for ranges regardless of date ranges or other types of ranges since they are essentially tuples. Would love to know what others think about this <3

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0