[ruby-core:111210] [Ruby master Bug#19184] create a Range with String subclass presents a weird behavior

Issue #19184 has been reported by clavius_tales (Clavius Tales Rocha Moreira). ---------------------------------------- Bug #19184: create a Range with String subclass presents a weird behavior https://bugs.ruby-lang.org/issues/19184 * Author: clavius_tales (Clavius Tales Rocha Moreira) * Status: Open * Priority: Normal * ruby -v: 3.1.3 * Backport: 2.7: UNKNOWN, 3.0: UNKNOWN, 3.1: UNKNOWN ---------------------------------------- ``` ruby 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: ``` ruby ["2021-11", "2021-12", "2022-01", "2022-02"] ``` Running the same script in Ruby 3.1.3: ```ruby ["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... -- https://bugs.ruby-lang.org/

Issue #19184 has been updated by clavius_tales (Clavius Tales Rocha Moreira). ``` ruby class CalendarMonth < String def succ self.class.new(next_month_string) end private def next_month_string if december? "#{year + 1}-01" else "#{year}-#{(month + 1).to_s.rjust(2, '0')}" end end 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: ``` ruby ["2021-11", "2021-12", "2022-01", "2022-02"] ``` Running the same script in Ruby 3.1.3: ``` ruby ["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... ---------------------------------------- Bug #19184: create a Range with String subclass presents a weird behavior https://bugs.ruby-lang.org/issues/19184#change-100501 * Author: clavius_tales (Clavius Tales Rocha Moreira) * Status: Open * Priority: Normal * ruby -v: 3.1.3 * Backport: 2.7: UNKNOWN, 3.0: UNKNOWN, 3.1: UNKNOWN ---------------------------------------- ``` ruby 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: ``` ruby ["2021-11", "2021-12", "2022-01", "2022-02"] ``` Running the same script in Ruby 3.1.3: ```ruby ["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... -- https://bugs.ruby-lang.org/

Issue #19184 has been updated by zverok (Victor Shepelev). Status changed from Open to Feedback It is not about Range, but about the change of `String#succ` behavior. [Here is the reason](https://rubyreferences.github.io/rubychanges/3.0.html#string-always-returnin...) + 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. ---------------------------------------- Bug #19184: create a Range with String subclass presents a weird behavior https://bugs.ruby-lang.org/issues/19184#change-100502 * Author: clavius_tales (Clavius Tales Rocha Moreira) * Status: Feedback * Priority: Normal * ruby -v: 3.1.3 * Backport: 2.7: UNKNOWN, 3.0: UNKNOWN, 3.1: UNKNOWN ---------------------------------------- ``` ruby 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: ``` ruby ["2021-11", "2021-12", "2022-01", "2022-02"] ``` Running the same script in Ruby 3.1.3: ```ruby ["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... -- https://bugs.ruby-lang.org/
participants (2)
-
clavius_tales (Clavius Tales Rocha Moreira)
-
zverok (Victor Shepelev)