On Nov 12, 10:10 am, Phrogz <phr... / mac.com> wrote:
> On Nov 12, 5:00 am, Trans <transf... / gmail.com> wrote:
> [...]> In Ruby, methods are not first
> > class objects. (Though to go with Ruby's 100% OOP mantra you would
> > think they would be, but in any case...)
>
> [...]
>
> I used to think and wish for this too, and complain about it often.
> Then, while implementing my own OOP version of Lua, I had an epiphany:
>
> How can a method be a first-class object *and* have #super work?

You mean to unify UnboundMethod and Method. I suppose UnboundMethod
could keep a table of the classes it was in.

> For #super to work, you need a method to know what class it is
> associated with, so that it can search the ancestor chain. But as soon
> as you associate it with a class, it's no longer a first class object.
>
> (If you try to use the class of the receiver, it works for one level
> up, but beyond that it fails.)
>
> For more details, see my original post on this topic. [1] Please poke
> holes in it. I'd love to see how Ruby could treat all methods as first-
> class objects interchangeable with blocks/procs/lambdas, unifying the
> madness (which, of course, would need some way to control the
> different arity handling), but I'm not seeing it as possible right
> now.
>
> [1]http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/179372
> Feel free to poke holes in my argument

I'm not so sure about the #initialize thing. I think maybe your
troubles came from lua and how you went about it there. Ruby creates
an object basically like this:

  class Class
    def new(*a, &b)
      o = allocate
      o.initialize(*a, &b)
      o
    end
  end

In fact you can use that as a basis for some fun meta-coding.

  class Class
    alias_method :postinitialize_new, :new
    def new(*args, &blk)
      o = allocate
      a = ancestors
      until a.empty?
        m = a.pop
        if m.method_defined?('preinitialize') or
m.private_method_defined?('preinitialize')
          im = instance_method('preinitialize')
          im.arity == 0 ? im.bind(o).call : im.bind(o).call(*args,
&blk)
        end
      end
      o.__send__(:initialize, *args, &blk) if
o.object_class.private_method_defined?(:initialize)
      o
    end
  end

So i don't see why it can't be:

  class Class
    def new(*a, &b)
      o = allocate
      o.new(*a, &b)
      o
    end
  end

also, from your post, I wish ruby did this always!:

"(For those not familiar with Lua, the colon used when defining a
function means "Hey, please create an implicit first parameter named
'self', because I'm too lazy to type it each time." This is why I can
pass the 'self' from the subclasses to the parent method, and have the
initializer operate on it instead.)"

T.