On 10/22/07, Garret Kelly <garret.kelly / gmail.com> wrote:
> Hi,
> I'm sure if I'm missing something fundamental, but when you run the
> code below with comments intact it won't execute, claiming that:
>
> ../test.rb:13:in `something': undefined method `some_function' for
> #<B:0x2b9c102564a8> (NoMethodError)
>         from ../test.rb:30
>
> When the comments are removed, the code will run. The thing I can't
> understand is why, when the comments are in-place, the call to
> some_function from within an instance of B doesn't work. Can anyone
> point me in the right direction?

I'm not sure what you're actually trying to accomplish, so I can't
really fix it but.

> class A
>     def self.some_function(param)
>         puts "param: #{param}"
>     end

Okay, now you've got a class method named some_function defined in A.

>
> #    def some_function(*args)
> #        puts self
> #        B.some_function(*args)
> #    end

If you uncomment this it defines an instance method in A also called
some_function.

>     def self.register(name, &block)
>         define_method(name) do |*args|
>             some_function("thing")
>             block.call(args)
>         end
>     end

This will define an instance method in A or a subclass, which is named
whatever is passed in the name argument.

The body of this method will call the instance method some_function on
the receiver and then evaluate the block passed into register.

>     def initialize
>         puts "I'm a #{self.class}"
>     end
> end
>
> class B < A
>     register :something do |*args|
>         some_function("something")
>     end
> end

Now you call the register method you defined passing :something to be
used as the name, this effectively is as if you'd coded:

class B
   def something(*args)
        some_function("thing")
        some_function("something")}  # although this would really
evaluate the block if you ever got here
   end

> b = B.new
> b.something

WIth the code commented out, you never defined an instance method some_function.


-- 
Rick DeNatale

My blog on Ruby
http://talklikeaduck.denhaven2.com/