Actions
Bug #19184
closedcreate a Range with String subclass presents a weird behavior
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
Like0
Like1