Project

General

Profile

Actions

Bug #19184

closed

create a Range with String subclass presents a weird behavior

Added by clavius_tales (Clavius Tales Rocha Moreira) almost 2 years ago. Updated almost 2 years ago.

Status:
Feedback
Assignee:
-
Target version:
-
[ruby-core:111210]

Description

class CalendarMonth < String
  def succ
    self.class.new(
      if december?
        "#{year + 1}-01"
      else
        "#{year}-#{(month + 1).to_s.rjust(2, '0')}"
      end
    )
  end

  private

  def december?
    month == 12
  end
  
  def month
    self[-2..].to_i
  end

  def year
    self[0..3].to_i
  end
end

(CalendarMonth.new('2021-11')..CalendarMonth.new('2022-02')).to_a

Running the script above in Ruby 2.7.5, we get:

["2021-11", "2021-12", "2022-01", "2022-02"]

Running the same script in Ruby 3.1.3:

["2021-11",
 "2021-12",
 "2021-13",
 "2021-14",
 "2021-15",
 "2021-16",
 "2021-17",
 "2021-18",
 "2021-19",
 "2021-20",
 "2021-21",
 "2021-22",
 "2021-23",
 "2021-24",
 "2021-25",
 "2021-26",
 "2021-27",
 "2021-28",
 "2021-29",
 "2021-30",
 "2021-31",
 "2021-32",
 "2021-33",
 "2021-34",
 "2021-35",
 "2021-36",
 "2021-37",
 "2021-38",
 "2021-39",
 "2021-40",
 "2021-41",
 "2021-42",
 "2021-43",
 "2021-44",
 "2021-45",
 "2021-46",
 "2021-47",
 "2021-48",
 "2021-49",
 "2021-50",
 "2021-51",
 "2021-52",
 "2021-53",
 "2021-54",
 "2021-55",
 "2021-56",
 "2021-57",
 "2021-58",
 "2021-59",
 "2021-60",
 "2021-61",
 "2021-62",
 "2021-63",
 "2021-64",
 "2021-65",
 "2021-66",
 "2021-67",
 "2021-68",
 "2021-69",
 "2021-70",
 "2021-71",
 "2021-72",
 "2021-73",
 "2021-74",
 "2021-75",
 "2021-76",
 "2021-77",
 "2021-78",
 "2021-79",
 "2021-80",
 "2021-81",
 "2021-82",
 "2021-83",
 "2021-84",
 "2021-85",
 "2021-86",
 "2021-87",
 "2021-88",
 "2021-89",
 "2021-90",
 "2021-91",
 "2021-92",
 "2021-93",
 "2021-94",
 "2021-95",
 "2021-96",
 "2021-97",
 "2021-98",
 "2021-99",
 "2022-00",
 "2022-01",
 "2022-02"]

I know it's not a good modeling inherit from String class, but...

Updated by zverok (Victor Shepelev) almost 2 years ago

  • Status changed from Open to Feedback

It is not about Range, but about the change of String#succ behavior.

Here is the reason + explanation of the behavior change. Basically, #succ and other methods that produce strings from the current string, were consistently redefined to return the String, not the current subclass.

Actions

Also available in: Atom PDF

Like0
Like1