[#67346] Future of test suites for Ruby — Charles Oliver Nutter <headius@...>

I'll try to be brief so we can discuss all this. tl;dr: RubySpec is

19 messages 2015/01/05

[ruby-core:67391] [ruby-trunk - Bug #10702] Constant look up inconsistency with constants defined in included modules

From: kwstannard@...
Date: 2015-01-07 14:28:52 UTC
List: ruby-core #67391
Issue #10702 has been updated by Kelly Stannard.


Jack Nagel wrote:
> `D` does not inherit from `C` or `A`, so it does not have access to `B`.
> 
> After assigning `B = B`, `E` can "see" `B` lexically.
> 
> However, if you reopen `E` as `C::E`, it will "lose" `B`:
> 
> ```ruby
> class C::E
>   B # => uninitialized constant C::E::B (NameError)
> end
> ```
> 
> This is described in http://cirw.in/blog/constant-lookup.html, among other good articles on constant resolution in Ruby.

I looked at that blog before I posted and if constant lookup worked like it says then what I am doing would work because D is nested in C at the point where I am trying to access B. The nested opening of D should have access to all constants that C has access to but it doesn't. If this was consistent then either I should not be able to access B on line 9 or I should be able to access it on line 12.

----------------------------------------
Bug #10702: Constant look up inconsistency with constants defined in included modules
https://bugs.ruby-lang.org/issues/10702#change-50831

* Author: Kelly Stannard
* Status: Rejected
* Priority: Normal
* Assignee: 
* Category: core
* Target version: 
* ruby -v: 2.2-head
* Backport: 2.0.0: UNKNOWN, 2.1: UNKNOWN, 2.2: UNKNOWN
----------------------------------------
https://gist.github.com/kwstannard/c0f722976ba023cc5755

```ruby
module A
  module B
  end
end

module C
  include A

  puts B.inspect # => A::B

  class D
    puts B.inspect rescue puts 'failed' # => failed
  end

  B = B

  class E
    puts B.inspect # => A::B
  end
end
```

When you include a module you gain access to that module's constants as seen in line 9. Line 19 shows that you can get constants defined in the nested module when the constant is defined within the module itself.

Line 12 is the bug. Shouldn't class `D` be able to access module `B` since the previous line shows that module `C` has access to Module `B`?



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

In This Thread

Prev Next