Project

General

Profile

Actions

Feature #5148

closed

Constant Namespace/Scoping in Dynamic Classes/Modules

Added by trans (Thomas Sawyer) over 12 years ago. Updated almost 12 years ago.

Status:
Rejected
Assignee:
-
Target version:
-
[ruby-core:38723]

Description

When defining a dynamic class or module, the constants defined within it are not kept within it's namespace, but are tied to the outer scope's namespace.

c = Class.new do
  module M; end
end
#=> #<Class:0xa601300>
c::M  #=> M                                                                   
M     #=> M

This presents serious limitations in designing domain specific languages that take advantage of Ruby's class system. For instance in creating a test framework that uses blocks to defines testcases it is not possible to isolate fixture constants from those of other testcases. E.g.

describe "fancy mixin" do
  class Foo
    include FancyMixin
  end
  ...
end

describe "unfancy mixin" do
  class Foo
    include UnfancyMixin
  end
  ...
end

Foo in the unfancy testcase will use Foo in the fancy testcase, causing unexpected issues --especially as these testcases may be defined in different files and coded by different people.

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0