From: "eLobato (Daniel Lobato Garcia)" Date: 2013-05-12T09:39:33+09:00 Subject: [ruby-core:54921] [ruby-trunk - Bug #8393][Open] A class who's parent class is in a module can go wrong if files are required in the wrong order Issue #8393 has been reported by eLobato (Daniel Lobato Garcia). ---------------------------------------- Bug #8393: A class who's parent class is in a module can go wrong if files are required in the wrong order https://bugs.ruby-lang.org/issues/8393 Author: eLobato (Daniel Lobato Garcia) Status: Open Priority: Normal Assignee: Category: Target version: ruby -v: ruby 2.0.0dev (2012-11-01 trunk 37411) [x86_64-linux] Backport: 1.9.3: UNKNOWN, 2.0.0: UNKNOWN Hi, I have found that inheritance is not done properly in a certain case. Let's say we have the following files: -------------- animal.rb - class Animal def bark puts 'fuck.' end end dog.rb - module Bark class Dog < Animal end end bark.rb - module Bark class Animal def bark puts 'woof' end end end ------------ If these files are required in that order (or any order where Bark::Animal is not required before Animal), Bark::Dog.new.bark will output "fuck.", showing the inheritance was done wrong, because in the case that there are two classes from which it can inherit (Animal and Bark::Animal), it should inherit from the class inside its module (Bark). A workaround for this is defining Dog as Dog < Bark::Animal, that forces Dog to use the correct Animal class. I found this on the latest 1.8.7, 1.9.2, 1.9.3 and 2.0.0dev, both using rvm and without using it. I could not find information about this on the issue tracker or on Google. In my opinion a way to fix this is to check when a file is required if any of our current files could inherit from something in a module of the file that is imported, but that looks like it can be complicated with nested modules, etc.. so I'm all ears for better design decisions. I would like to fix this myself as my first Ruby core contribution, but I was unsure if this is an actual bug. To me it looks like this behavior is totally unexpected, let me know if anything is wrong here. Thanks! -- http://bugs.ruby-lang.org/