[ruby-core:91461] [Ruby trunk Feature#5632] Attempt to open included class shades it instead.

From: matz@...
Date: 2019-02-07 07:49:13 UTC
List: ruby-core #91461
Issue #5632 has been updated by matz (Yukihiro Matsumoto).

Status changed from Assigned to Closed

After 7 years of consideration, I reject this issue.  In the example in the original, the first `X` class is defined as `A::X` and the second definition (override attempt) was done in `B::X`. Since they are different, we define different classes. Case closed.

Matz.


----------------------------------------
Feature #5632: Attempt to open included class shades it instead.
https://bugs.ruby-lang.org/issues/5632#change-76722

* Author: Anonymous
* Status: Closed
* Priority: Normal
* Assignee: mame (Yusuke Endoh)
* Target version: Next Major
----------------------------------------
```
# Hello everyone. I'm not a very advanced ruby user, and I
# would like to provide and outsider report on certain ruby
# behavior that might surprise newbies.

module A
  class X
    def hello; puts 'hello' end
  end
end

module B
  include A
end

B::X.new.hello
=> hello
# As expected.

# But when I tried to add new functionality to X, ...
module B
  class X
    def goodbye; puts 'goodbye' end
  end
end

B::X.new.hello
=> NoMethodError

# I was surprised, that my .hello method disappeared,
# when all I was trying to do, was to improve X in B.
# I actually somehow expected to work on a subclass
# of X, like this:

module C
  include A
  class X < X
    def goodbye; puts 'goodbye' end
  end
end

# My suggestions are:
# 1. I consider 'class X < X' syntax a little bit
#    mysterious. How about making this a default
#    behavior for 'class X' statements?
# 2. If the above is not considered beneficial, I
#    would welcome if 'class X' statement warned
#    when shadowing an existing name. People might
#    often assume that they are opening an existing
#    class, rather than getting a brand new one
#    shadowing the previous one. If people really
#    want a brand new shadowing class without warning
#    they could use explicit 'X = Class.new'.
```



-- 
https://bugs.ruby-lang.org/

Unsubscribe: <mailto:ruby-core-request@ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>

In This Thread

Prev Next