Feature #20093
openSyntax or keyword to reopen existing classs/modules, never to define new classs/modules
Description
class A and module B will reopen existing class A or module B to add/re-define methods if A/B exists. Otherwise, these will define the new class/module A/B.
But, in my opinion, the code of class A for patching existing classes doesn't work expectedly when A is not defined beforehand. It expects other codes to define A before being called.
For example:
This code expects that there is the String class, and it has the include? method. This code doesn't work if the file is loaded in the way below:
This code doesn't raise errors and will define an almost empty class (only with a method exclude? to raise NameError). It should be unexpected for every user.
So, I want to propose a new syntax to reopen the existing class/module or raise errors if the specified class/module is not defined.
class extension String
def exclude?(string)
!include?(string)
end
end # adds #exclude? to String class
class extension Stroooong
def exclude?(string)
!include?(string)
end
end # will raise NameError (or something else)
Some additional things:
class extension String(andmodule extension String) causes a compile error (SyntaxError) on Ruby 3.3. So we have space to add a keyword between class/module and the class/module name.- I don't have a strong opinion about the keyword name
extension. An alternative idea isreopen.