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:
# string_exclude.rb
class String
def exclude?(string)
!include?(string)
end
end
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:
load('string_exclude.rb', true)
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
.