Ara.T.Howard / noaa.gov schrieb:

>
> no.  the new behaviour is fine - i was simply describing how it is now 
> and how
> that relates to the 'infinite levels' issue in that i think it's  
> strange -
> but consistent.  believe me - you've no idea how much easier my trait lib
> would have been to write if
>
>   child.singleton_class < parent.singleton_class


Well it would be nice if this were true, but it's not - "higher order" 
singleton class
behavior changed quite a bit in the past and it so again from 1.82 to 
todays cvs.
Lionel point was because Ruby does not seem to have a consistent treatment
(consitency is always relative to the reades eyes)  of these "higher 
order" singleton
classes,  they should be forbidden in the first place.  I ran the 
following script
with a standard 1.82, todays cvs.

----
puts RUBY_VERSION
public # create meta objects

def m(height =1)
   height.zero? ? self  :   class << self; self end.m(height -1)
end

base = [Object,Module, Class]
require 'enumerator'

(0..11).each_cons(2) do |a,b|
  d0,r0 = a.divmod(3)
  d1,r1 = b.divmod(3)
  rel = base[r0].m(d0) > base[r1].m(d1)
  puts "#{base[r0]}.m(#{d0}) > #{base[r1]}.m(#{d1}) # #{rel}"
end

class A; end
class B < A; end

def q(s)
  puts  s << " # #{eval(s)}"
end

puts "\n###","\n"
q "B.new.m(5) < B.m(4)"
q "B.m(4) < A.m(4)"
q "A.m(4) < Object.m(4)"

puts "\n### print superclass chain","\n"
class Class
  alias succ superclass
end

(1..8).each do |i|
  puts ((B.new.m(i)..Object).to_a.join(" : "))
end
---

These were the two outputs

---
1.9.0
Object.m(0) > Module.m(0) # true
Module.m(0) > Class.m(0) # true
Class.m(0) > Object.m(1) # true
Object.m(1) > Module.m(1) # true
Module.m(1) > Class.m(1) # true
Class.m(1) > Object.m(2) # false
Object.m(2) > Module.m(2) # false
Module.m(2) > Class.m(2) # false
Class.m(2) > Object.m(3) # true
Object.m(3) > Module.m(3) # false
Module.m(3) > Class.m(3) # false

###

B.new.m(5) < B.m(4) # true
B.m(4) < A.m(4) # false
A.m(4) < Object.m(4) # false
### print superclass chain

#<Class:#<B:0x101030a0>> : B : A : Object
Class : Module : Object
#<Class:Class> : #<Class:Module> : #<Class:Object> : Class : Module : Object
Class : Module : Object
#<Class:Class> : #<Class:Module> : #<Class:Object> : Class : Module : Object
Class : Module : Object
#<Class:Class> : #<Class:Module> : #<Class:Object> : Class : Module : Object
Class : Module : Object
---
and
---
1.8.2
Object.m(0) > Module.m(0) # true
Module.m(0) > Class.m(0) # true
Class.m(0) > Object.m(1) # true
Object.m(1) > Module.m(1) #
Module.m(1) > Class.m(1) # true
Class.m(1) > Object.m(2) # true
Object.m(2) > Module.m(2) #
Module.m(2) > Class.m(2) #
Class.m(2) > Object.m(3) #
Object.m(3) > Module.m(3) #
Module.m(3) > Class.m(3) #

###

B.new.m(5) < B.m(4) #
B.m(4) < A.m(4) #
A.m(4) < Object.m(4) #
### print superclass chain

#<Class:#<B:0x2793bc8>> : B : A : Object
#<Class:#<Class:#<B:0x2793a60>>> : #<Class:B> : #<Class:A> : 
#<Class:Object> : Class : Module : Object
#<Class:#<Class:#<Class:#<B:0x2793820>>>> : #<Class:Class> : 
#<Class:Module> : #<Class:Object> : Class : Module : Object
#<Class:#<Class:#<Class:#<Class:#<B:0x2793598>>>>> : #<Class:Class> : 
#<Class:Module> : #<Class:Object> : Class : Module : Object
#<Class:#<Class:#<Class:#<Class:#<Class:#<B:0x27932c8>>>>>> : 
#<Class:Class> : #<Class:Module> : #<Class:Object> : Class : Module : Object
#<Class:#<Class:#<Class:#<Class:#<Class:#<Class:#<B:0x2792fb0>>>>>>> : 
#<Class:Class> : #<Class:Module> : #<Class:Object> : Class : Module : Object
#<Class:#<Class:#<Class:#<Class:#<Class:#<Class:#<Class:#<B:0x2792c50>>>>>>>> 
: #<Class:Class> : #<Class:Module> : #<Class:Object> : Class : Module : 
Object
#<Class:#<Class:#<Class:#<Class:#<Class:#<Class:#<Class:#<Class:#<B:0x27928a8>>>>>>>>> 
: #<Class:Class> : #<Class:Module> : #<Class:Object> : Class : Module : 
Object
---



>
> as it were i had to do this
>
>   class << self
>     # determine our 'singleton_super' so we can use it's ancestors
>   end
>
> and this is precisely because parent/child meta classes do not fit 
> into the
> same kind of hierarchy as their respective classes.  so i will love 
> the new
> behaviour.
>
> i'm going to quit on this now because i feel like i've only confused 
> things.
> sorry if i have.


I promise I will quit this too, well after this post:-)

/Christoph