Project

General

Profile

Actions

Feature #20093

open

Syntax or keyword to reopen existing classs/modules, never to define new classs/modules

Added by tagomoris (Satoshi Tagomori) 4 months ago. Updated 4 months ago.

Status:
Open
Assignee:
-
Target version:
-
[ruby-core:115919]

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 (and module 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 is reopen.
Actions

Also available in: Atom PDF

Like1
Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0