Class and Mixin with same method name problem

Discussion in 'Ruby' started by petermichaux@yahoo.com, Nov 4, 2005.

  1. Guest

    Hi,

    I'm trying to call a modual method from a class method with the same
    name. The code I tried and error are below. I think my "Debug.whoAmI?"
    line is the problem. What is the correct syntax to call the moduals
    method?

    Thanks,
    Peter

    ==== CODE ===

    module Debug
    def whoAmI?
    "#{self.class.name}"
    end
    end

    class EightTrack
    include Debug
    def whoAmI?
    Debug.whoAmI?
    end
    end

    et = EightTrack.new

    p et.whoAmI?


    === OUTPUT ERROR ===

    peter$ ruby mixin.rb
    mixin.rb:10:in `whoAmI?': undefined method `whoAmI?' for Debug:Module
    (NoMethodError)
    from mixin.rb:16
    , Nov 4, 2005
    #1
    1. Advertising

  2. Stefan Lang Guest

    On Friday 04 November 2005 17:32, wrote:
    > Hi,
    >
    > I'm trying to call a modual method from a class method with the
    > same name. The code I tried and error are below. I think my
    > "Debug.whoAmI?" line is the problem. What is the correct syntax to
    > call the moduals method?
    >
    > Thanks,
    > Peter
    >
    > =3D=3D=3D=3D CODE =3D=3D=3D
    >
    > module Debug
    > def whoAmI?
    > "#{self.class.name}"
    > end
    > end
    >
    > class EightTrack
    > include Debug
    > def whoAmI?
    > Debug.whoAmI?
    > end
    > end
    >
    > et =3D EightTrack.new
    >
    > p et.whoAmI?
    >
    >
    > =3D=3D=3D OUTPUT ERROR =3D=3D=3D
    >
    > peter$ ruby mixin.rb
    > mixin.rb:10:in `whoAmI?': undefined method `whoAmI?' for
    > Debug:Module (NoMethodError)
    > from mixin.rb:16


    Try this:
    =2D---------------------
    module Debug
    =A0 def whoAmI?
    =A0 =A0 "#{self.class.name}"
    =A0 end
    end

    class EightTrack
    =A0 include Debug
    end

    et =3D EightTrack.new

    p et.whoAmI?
    =2D---------------------

    Regards,
    Stefan
    Stefan Lang, Nov 4, 2005
    #2
    1. Advertising

  3. ts Guest

    >>>>> "p" == petermichaux <> writes:

    p> class EightTrack
    p> include Debug
    p> def whoAmI?
    p> Debug.whoAmI?

    super

    p> end
    p> end


    Guy Decoux
    ts, Nov 4, 2005
    #3
  4. Guest

    ts, Thank you. Peter
    , Nov 4, 2005
    #4
  5. Guest

    What if two moduals are included and each uses the same method name? In
    the example below the Debug whoAmI? method is called. How do I call the
    Burp whoAmI? method?

    Thanks,
    Peter

    module Debug
    def whoAmI?
    "#{self.class.name}"
    end
    end

    module Burp
    def whoAmI?
    "Burp #{self.class.name}"
    end
    end

    class EightTrack
    include Burp
    include Debug
    def whoAmI?
    super
    end
    end

    et = EightTrack.new

    p et.whoAmI?
    , Nov 4, 2005
    #5
  6. Stefan Lang Guest

    On Friday 04 November 2005 18:07, wrote:
    > What if two moduals are included and each uses the same method
    > name? In the example below the Debug whoAmI? method is called. How
    > do I call the Burp whoAmI? method?


    There is no clean and simple way to do so.

    > module Debug
    > def whoAmI?
    > "#{self.class.name}"
    > end
    > end
    >
    > module Burp
    > def whoAmI?
    > "Burp #{self.class.name}"
    > end
    > end
    >
    > class EightTrack
    > include Burp
    > include Debug

    The following method definition is useless.
    Remove it and you'll get the same result.
    > def whoAmI?
    > super
    > end
    > end
    >
    > et = EightTrack.new
    >
    > p et.whoAmI?


    --
    Stefan
    Stefan Lang, Nov 4, 2005
    #6
  7. Guest

    no clean and simple way? bummer. I thought there would be some sort of
    namespace separation between the two moduals. When they are mixed into
    the EightTrack class are the namespaces lost?
    , Nov 4, 2005
    #7
  8. wrote:
    > What if two moduals are included and each uses the same method name?
    > In the example below the Debug whoAmI? method is called. How do I
    > call the Burp whoAmI? method?


    You don't (although you could with
    Burp.instance_method:)whoAmI?).bind(self).call). Messing like this with
    names is not advisable.

    Note also that "self.class.name" will always yield the same result
    regardless in which module the method was defined. Note also that by
    convention a) methods ending in a question mark are reserved for boolean
    queries and b) Ruby uses lowe_case_method_names. :)

    Kind regards

    robert


    > Thanks,
    > Peter
    >
    > module Debug
    > def whoAmI?
    > "#{self.class.name}"
    > end
    > end
    >
    > module Burp
    > def whoAmI?
    > "Burp #{self.class.name}"
    > end
    > end
    >
    > class EightTrack
    > include Burp
    > include Debug
    > def whoAmI?
    > super
    > end
    > end
    >
    > et = EightTrack.new
    >
    > p et.whoAmI?
    Robert Klemme, Nov 4, 2005
    #8
  9. Guest

    Robert Klemme wrote:
    > wrote:
    > > How do I call the Burp whoAmI? method?

    >
    > You don't (although you could with
    > Burp.instance_method:)whoAmI?).bind(self).call). Messing like this with names is not advisable.


    Good to know that there is a way to do this. Too bad it is so messy
    though. I'm thinking about using two Rails plugins in one model class.
    Since rails has a magic after_find callback method I was thinking about
    using this in each plugin since the plugins can be used independently.
    Since my model must call both of these methods I will have a third
    after_find callback method in the model that calls the other two. Now
    why doesn't the example below make two who_am_i calls? One to Burp and
    one to Debug. It only calls Burp.

    > Note also that by
    > convention a) methods ending in a question mark are reserved for boolean
    > queries and b) Ruby uses lowe_case_method_names. :)


    Good to know. I just cut and pasted the example from the the first
    edition of Ruby Programming

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

    Peter


    module Debug
    def who_am_i
    "Debug"
    end
    end

    module Burp
    def who_am_i
    "Burp"
    end
    end

    class EightTrack
    include Burp
    include Debug
    def who_am_i
    Debug.instance_method:)who_am_i).bind(self).call
    Burp.instance_method:)who_am_i).bind(self).call
    end
    end

    et = EightTrack.new

    p et.who_am_i
    , Nov 4, 2005
    #9
  10. wrote:
    > Robert Klemme wrote:
    >> wrote:
    >>> How do I call the Burp whoAmI? method?

    >>
    >> You don't (although you could with
    >> Burp.instance_method:)whoAmI?).bind(self).call). Messing like this
    >> with names is not advisable.

    >
    > Good to know that there is a way to do this. Too bad it is so messy
    > though. I'm thinking about using two Rails plugins in one model class.
    > Since rails has a magic after_find callback method I was thinking
    > about using this in each plugin since the plugins can be used
    > independently. Since my model must call both of these methods I will
    > have a third after_find callback method in the model that calls the
    > other two.


    I don't know Rails so I can't comment on this. I just would assume that DHH
    would have thought of this scenario. At least it sounds reasonable. Or
    you're abusing these plugins.

    > Now why doesn't the example below make two who_am_i calls?
    > One to Burp and one to Debug. It only calls Burp.


    Wrong. Look again. :)

    >> Note also that by
    >> convention a) methods ending in a question mark are reserved for
    >> boolean
    >> queries and b) Ruby uses lowe_case_method_names. :)

    >
    > Good to know. I just cut and pasted the example from the the first
    > edition of Ruby Programming
    >
    > http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_modules.html


    Indeed. Then that's a sub optimal example. :)

    > Peter
    >
    >
    > module Debug
    > def who_am_i
    > "Debug"
    > end
    > end
    >
    > module Burp
    > def who_am_i
    > "Burp"
    > end
    > end
    >
    > class EightTrack
    > include Burp
    > include Debug
    > def who_am_i
    > Debug.instance_method:)who_am_i).bind(self).call
    > Burp.instance_method:)who_am_i).bind(self).call
    > end
    > end
    >
    > et = EightTrack.new
    >
    > p et.who_am_i


    Kind regards

    robert
    Robert Klemme, Nov 4, 2005
    #10
  11. daz Guest

    RK wrote:
    > petermichaux wrote:
    > > Robert Klemme wrote:

    >
    > > Now why doesn't the example below make two who_am_i calls?
    > > One to Burp and one to Debug. It only calls Burp.

    >
    > Wrong. Look again. :)
    >


    Peter, you've annoyed Robert - he won't help you now ;-)

    If you go to the trouble of calling a method, you may as well
    do something with its return value rather than just losing it.


    module Debug
    def who_am_i
    'Debug'
    end
    end

    module Burp
    def who_am_i
    'Burp'
    end
    end

    module Throb
    # #def who_am_i
    # # 'Throb'
    # #end
    end

    class EightTrack
    include Burp
    include Throb
    include Debug
    def who_am_i
    wai = [self.class]
    ( self.class.ancestors - [Object, Kernel] - wai ).each do |a|
    ( wai << a.instance_method:)who_am_i).bind(self).call ) rescue nil
    end
    wai
    end
    end

    et = EightTrack.new

    p et.who_am_i # [EightTrack, "Debug", "Burp"]



    daz
    daz, Nov 4, 2005
    #11
  12. Guest

    Robert Klemme wrote:
    > wrote:


    > > Now why doesn't the example below make two who_am_i calls?
    > > One to Burp and one to Debug. It only calls Burp.

    >
    > Wrong. Look again. :)


    Victim of a new language. I got it. Thanks!

    Peter



    > > module Debug
    > > def who_am_i
    > > "Debug"
    > > end
    > > end
    > >
    > > module Burp
    > > def who_am_i
    > > "Burp"
    > > end
    > > end
    > >
    > > class EightTrack
    > > include Burp
    > > include Debug
    > > def who_am_i
    > > Debug.instance_method:)who_am_i).bind(self).call
    > > Burp.instance_method:)who_am_i).bind(self).call
    > > end
    > > end
    > >
    > > et = EightTrack.new
    > >
    > > p et.who_am_i
    , Nov 4, 2005
    #12
  13. Guest

    daz wrote:

    > If you go to the trouble of calling a method, you may as well
    > do something with its return value rather than just losing it.


    Actually Robert's cryptic smiley lead me to this. But thanks for the
    straight goods.

    Peter
    , Nov 4, 2005
    #13
  14. daz wrote:
    > RK wrote:
    >> petermichaux wrote:
    >>> Robert Klemme wrote:

    >>
    >>> Now why doesn't the example below make two who_am_i calls?
    >>> One to Burp and one to Debug. It only calls Burp.

    >>
    >> Wrong. Look again. :)
    >>

    >
    > Peter, you've annoyed Robert - he won't help you now ;-)


    LOL. No, not really. (Now you want to know where that "no" refers to...
    :)))

    Kind regards

    robert
    Robert Klemme, Nov 7, 2005
    #14
    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. ding feng
    Replies:
    2
    Views:
    2,786
    ding feng
    Jun 25, 2003
  2. Mac
    Replies:
    1
    Views:
    570
  3. Payton Swick

    get mixin's name

    Payton Swick, Dec 29, 2005, in forum: Ruby
    Replies:
    5
    Views:
    146
    Robert Klemme
    Dec 29, 2005
  4. Farrel Lifson

    Mixin a module method as a class method

    Farrel Lifson, Oct 18, 2006, in forum: Ruby
    Replies:
    9
    Views:
    116
    Trans
    Oct 19, 2006
  5. John Lane
    Replies:
    6
    Views:
    177
    John Lane
    Feb 9, 2010
Loading...

Share This Page