what's wrong with this picture?

Discussion in 'Ruby' started by Serialhex .., Dec 2, 2010.

  1. Serialhex ..

    Serialhex .. Guest

    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

    --
    Posted via http://www.ruby-forum.com/.
    Serialhex .., Dec 2, 2010
    #1
    1. Advertising

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

    On Thu, Dec 2, 2010 at 3:20 PM, Serialhex .. <> wrote:

    > 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
    >
    > --
    > 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
    Andrew Wagner, Dec 2, 2010
    #2
    1. Advertising

  3. Serialhex ..

    Jeremy Bopp Guest

    On 12/2/2010 2:20 PM, Serialhex .. wrote:
    > 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
    Jeremy Bopp, Dec 2, 2010
    #3
  4. 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
    Reid Thompson, Dec 2, 2010
    #4
  5. 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!

    --
    Posted via http://www.ruby-forum.com/.
    .serialhex .., Dec 2, 2010
    #5
  6. 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

    >> Math.sinc(0.5)

    => 0.159154943091895

    --
    Posted via http://www.ruby-forum.com/.
    Brian Candler, Dec 2, 2010
    #6
  7. 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.

    --
    Posted via http://www.ruby-forum.com/.
    .serialhex .., Dec 3, 2010
    #7
  8. Serialhex ..

    botp Guest

    botp, Dec 3, 2010
    #8
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Alvin Bruney
    Replies:
    2
    Views:
    428
    Neil Kimber
    Jul 21, 2003
  2. Matthew
    Replies:
    7
    Views:
    669
    Priscilla Walmsley
    Jan 7, 2005
  3. Steve Jorgensen
    Replies:
    5
    Views:
    4,060
    Soren Kuula
    Aug 20, 2005
  4. Mensanator

    sympy: what's wrong with this picture?

    Mensanator, Mar 3, 2008, in forum: Python
    Replies:
    30
    Views:
    800
    Nanjundi
    Mar 5, 2008
  5. Replies:
    8
    Views:
    1,250
    Mick White
    Apr 19, 2005
Loading...

Share This Page