Если вы определите Oyster INSIDE для определения класса MyAnimals, тогда вы получите ответ, что leg_in_oyster равен 2.
Если вы определяете Устрицу отдельно, то есть определяете ее после того, как LEGS = 2 вышел из области видимости, вы получите ответ 4.
Это наводит меня на мысль, что вложенный класс ведет себя не так, как пространство имен, возможно, больше похоже на замыкание.
--- EDIT ---
irb(main):076:0> class MyAnimals::RunningRoach < Animal; def using_legs; LEGS; end; end
=> nil
irb(main):077:0> MyAnimals::RunningRoach.new.kind_of?(MyAnimals)
=> false
irb(main):078:0> MyAnimals::RunningRoach.new.kind_of?(Animal)
=> true
irb(main):081:0> class MyAnimals::Mantis < MyAnimals; def killing_legs; LEGS; end; end
=> nil
irb(main):082:0> MyAnimals::Mantis.new.kind_of?(Animal)
=> false
irb(main):083:0> MyAnimals::Mantis.new.kind_of?(MyAnimals)
=> true
irb(main):084:0> MyAnimals::Mantis.new.killing_legs
=> 2
irb(main):085:0> MyAnimals::RunningRoach.new.using_legs
=> 4
Согласно «Языку программирования Ruby», константы ищутся в лексической области того места, где они используются первыми, а во второй иерархии наследования. Так какова лексическая область действия чего-то, что наследует Animal? Само животное, верно? Класс MyAnimals переопределяет LEGS, поэтому все, что использует LEGS и определено внутри MyAnimals, будет сначала искать LEGS внутри MyAnimals.