What's wrong with this picture?

so, i dont believe that i’ve done anything wrong, but i cant seem to get
a module to function properly, mabye i’m doing something stupidly
retartedly wrong, i dont know, but i’ve even typed it into irb and i get
the same thing. ruby keeps telling me that my method is undefined.
heres the output from irb:

irb(main):001:0> module DSP
irb(main):002:1> include Math
irb(main):003:1> def sinc(x)
irb(main):004:2> sin(PIx)/PIx
irb(main):005:2> end
irb(main):006:1> end
=> nil
irb(main):007:0> DSP.public_instance_methods
=> [:sinc]
irb(main):008:0> DSP.sinc(0)
NoMethodError: undefined method sinc' for DSP:Module from (irb):8 from C:/Ruby192/bin/irb:12:in
irb(main):009:0> sin 0
NoMethodError: undefined method sin' for main:Object from (irb):9 from C:/Ruby192/bin/irb:12:in
irb(main):010:0> Math.sin(0)
=> 0.0
irb(main):011:0> exit

as you can see i even tried to call Math.sin the same way i called
DSP.sinc and that worked… idfk what’s wrong, i’ve looked through what
stuff i have and it dosnt seem to make any sence so hopefully someone
with more programming knowhow can help me.

thx

On Thu, Dec 2, 2010 at 3:20 PM, Serialhex … [email protected]
wrote:

irb(main):005:2> end
from (irb):9
thx


Posted via http://www.ruby-forum.com/.

Your first clue is that it shows up in the list of
“public_instance_methods”. Which means you need an instance of something
to
run it. But…you can’t have an instance of a module, so wtf?. Well, if
you
define it this way, you need to have something like the following to use
it:
class MyDSPClass
include DSP
end
MyDSPClass.new.sinc(3)

Or, if you really want to be able to call DSP.sinc, then change your
definition of DSP to the following
module DSP
include Math
def self.sinc(x) # key difference here
end
end

This puts the method on self, which is the module at that point in
time.

Hope this helps.
Andrew

On 12/2/2010 2:20 PM, Serialhex … wrote:

irb(main):005:2> end
from (irb):9
from C:/Ruby192/bin/irb:12:in `’
irb(main):010:0> Math.sin(0)
=> 0.0
irb(main):011:0> exit

as you can see i even tried to call Math.sin the same way i called
DSP.sinc and that worked… idfk what’s wrong, i’ve looked through what
stuff i have and it dosnt seem to make any sence so hopefully someone
with more programming knowhow can help me.

You defined an instance method for DSP, but you need to call it as a
class method. The problem then is that your sinc method will need to
call sin also as a class method, so you need to extend Math rather than
include it. Try the following:

module DSP
extend Math
def self.sinc(x)
sin(PIx)/PIx
end
end

-Jeremy

thanks Reid, your fix worked, but why should i have to ‘include DSP’ if
the definition of the module is right there? that dosnt make any
sense!! but it’s working right now so i wont question too much, thanks!

Edit: Andrew your solution works too, (i didnt see it before, even tho
you posted first) but thats alot of self.xxx’s. is the main library
written like that? is Math written:

module Math
def self.sine(x)
# sine stuff
end
def self.cos(x)
# cosine stuff
end
end

??? that seems a little tedious (though i imagine with some nifty
metaprogramming you can add all the self’s) that just kinda seems odd to
me.

On Fri, Dec 03, 2010 at 05:20:49AM +0900, Serialhex … wrote:

so, i dont believe that i’ve done anything wrong, but i cant seem to get
…snip…
as you can see i even tried to call Math.sin the same way i called
DSP.sinc and that worked… idfk what’s wrong, i’ve looked through what
stuff i have and it dosnt seem to make any sence so hopefully someone
with more programming knowhow can help me.

perhaps

irb(main):011:0> include DSP
=> Object
irb(main):012:0> DSP::sinc(0)
=> 0.0
irb(main):013:0> DSP.sinc(0)
=> 0.0

.serialhex … wrote in post #965797:

Edit: Andrew your solution works too, (i didnt see it before, even tho
you posted first) but thats alot of self.xxx’s. is the main library
written like that? is Math written:

module Math
def self.sine(x)
# sine stuff
end
def self.cos(x)
# cosine stuff
end
end

??? that seems a little tedious (though i imagine with some nifty
metaprogramming you can add all the self’s) that just kinda seems odd to
me.

There is module_function (which is subtly different though :slight_smile:

module Math
module_function
def sinc(x)
sin(PIx)/PIx
end
end

or you can do module_function :sinc after the definition

Math.sinc(0.5)
=> 0.159154943091895

Brian, that’s wonderful… that’s a beautiful, elegant way to solve my
problem! though i’m sure the other ways are better in different
situations, this works beautifully (and your output of Math.sinc(0.5)
pointed out that my ‘newer and faster’ organization of the code was
apparently also goving me truncation errors and giving a value of
0.6366197723675814 WAYYYY off…)

thanks everybody for the help!

i’m sure i’ll be back with more Q’s… i’m still a noob but ruby is
proving WAY easier than my forays into C/C++, VB (which is ridiculously
verbose IMO) and the few other langs i’ve tried.

On Fri, Dec 3, 2010 at 5:05 AM, .serialhex … [email protected]
wrote:

thanks Reid, your fix worked, but why should i have to ‘include DSP’ if
the definition of the module is right there?

http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_modules.html