Project

General

Profile

Actions

Feature #19071

closed

Add Time#deconstruct, #deconstruct_keys, and #to_h

Added by zverok (Victor Shepelev) about 2 years ago. Updated about 2 years ago.

Status:
Closed
Assignee:
-
Target version:
-
[ruby-core:110422]

Description

I believe that Time being suitable for pattern-matching is a reasonable feature with many possible usages, which will increase usability of Time and would be a good show case for pattern matching.

Implementation decisions

Time#deconstruct:

  • returns time components in order [year, month, mday, hour, min, sec, subsec]
  • I believe the highest-to-lowest order is the only reasonable/guessable, and there is no point to put into the array all of the time information available (e.g. zone, wday, yday)
  • I am not sure (and open to discussion) about subsec. It seems to me the most basic sub-second unit of Time, but I might be wrong; also, it might be not that useful for array deconstruction.

Possible usage:

case tm
in [...2022, *]
  puts "previous year"
in [2022, 1..6, *]
  puts "Q1-2"
in [2022, 7..9, *]
  puts "Q3"
in [2022, month, day, *]
  puts "Current quarter, #{day}/#{month}"
end

Time#deconstruct_keys:

  • chosen keys: [:year, :month, :day, :yday, :wday, :hour, :min, :sec, :subsec, :dst, :zone]
  • I am open to discussing whether we should include other subsecond units (or any whatsoever)
  • It might be useful (but too loose interface) to support mon as a synonym for month?.. But might be confusing if somebody will unpack the **rest
  • day, not mday, seems most reasonable

Possible usages:

case t
in year: ...2022
  puts "too old"
in month: ..9
  puts "quarter 1-3"
in wday: 1..5, month:
  puts "working day in month #{month}"
end

if t in Time(wday: 3, day: ..7)
  puts "first Wednesday of the month"
end

Time#to_h:

  • added on a "why not" basis :) As we already have "convert to hash" in the form of deconstruct_keys(nil), having a canonic form seems harmles. Open for discussion.
  • keys are the same as for deconstruct_keys

Pull request: https://github.com/ruby/ruby/pull/6594

Actions

Also available in: Atom PDF

Like1
Like0Like0Like0Like0Like1Like0Like0Like0