modules and class methods.

B

Brad Phelan

Why does this not work!

########################################
module Foo
def self.foo a
puts a
end
end

class Bar
include Foo
foo "hello"
end

foo.rb:20: undefined method `foo' for Bar:Class (NoMethodError)
####################################

but this does

class Bar
def self.foo a
puts a
end
foo "hello"
end



What am I misunderstanding about modules????
 
B

Brad Phelan

Brad said:
Why does this not work!

########################################
module Foo
def self.foo a
puts a
end
end

class Bar
include Foo
foo "hello"
end

foo.rb:20: undefined method `foo' for Bar:Class (NoMethodError)
####################################

but this does

class Bar
def self.foo a
puts a
end
foo "hello"
end



What am I misunderstanding about modules????

The below code obviously work the way I wish

module Foo
def foo
puts "a"
end
end

class Bar
extend Foo
puts foo
end

however is there any way to get the same effect by using include. I
would like to mix in class and instance methods in one call. It seems
I can do one or the other but not both at the same time. Is that
correct?
 
D

dblack

Hi --

The below code obviously work the way I wish

module Foo
def foo
puts "a"
end
end

class Bar
extend Foo
puts foo
end

however is there any way to get the same effect by using include. I would
like to mix in class and instance methods in one call. It seems
I can do one or the other but not both at the same time. Is that
correct?

Basically, yes: mixing in a module inserts the module in only one
method lookup path, and a class and its instances generally have very
different lookup paths.

You can use the inherited hook in Module to do both -- for example:

module M
def self.included(c)
m = self
c.class_eval { extend m }
end

def meth
puts "here"
end
end

class C
include M
end

C.meth # here
C.new.meth # here


David

--
Q. What is THE Ruby book for Rails developers?
A. RUBY FOR RAILS by David A. Black (http://www.manning.com/black)
(See what readers are saying! http://www.rubypal.com/r4rrevs.pdf)
Q. Where can I get Ruby/Rails on-site training, consulting, coaching?
A. Ruby Power and Light, LLC (http://www.rubypal.com)
 
B

Brad Phelan

You can use the inherited hook in Module to do both -- for example:

module M
def self.included(c)
m = self
c.class_eval { extend m }
end

def meth
puts "here"
end
end

class C
include M
end

C.meth # here
C.new.meth # here


David

Now that is the sneaky little hook I was looking for.

Thanks

Brad
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,968
Messages
2,570,154
Members
46,702
Latest member
LukasConde

Latest Threads

Top