what's wrong with this picture?

S

Serialhex ..

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(PI*x)/PI*x
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 `<main>'
irb(main):009:0> sin 0
NoMethodError: undefined method `sin' for main:Object
from (irb):9
from C:/Ruby192/bin/irb:12:in `<main>'
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
 
A

Andrew Wagner

[Note: parts of this message were removed to make it a legal post.]

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(PI*x)/PI*x
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 `<main>'
irb(main):009:0> sin 0
NoMethodError: undefined method `sin' for main:Object
from (irb):9
from C:/Ruby192/bin/irb:12:in `<main>'
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
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
 
J

Jeremy Bopp

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(PI*x)/PI*x
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 `<main>'
irb(main):009:0> sin 0
NoMethodError: undefined method `sin' for main:Object
from (irb):9
from C:/Ruby192/bin/irb:12:in `<main>'
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(PI*x)/PI*x
end
end

-Jeremy
 
R

Reid Thompson

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
 
S

.serialhex ..

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!
 
B

Brian Candler

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 :)

module Math
module_function
def sinc(x)
sin(PI*x)/PI*x
end
end

# or you can do module_function :sinc after the definition
=> 0.159154943091895
 
S

.serialhex ..

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.
 

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,981
Messages
2,570,188
Members
46,731
Latest member
MarcyGipso

Latest Threads

Top