Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Ruby > Overridding A Method Via A Mixin

Reply
Thread Tools

Overridding A Method Via A Mixin

 
 
Andrew Stewart
Guest
Posts: n/a
 
      01-15-2008
Hi Everyone,

I believe one can add methods to a class by including a module but
not override existing methods. Indeed Dr Nic said as much here:

http://ruby.tie-rack.org/6/safely-ov..._missing-in-a-
class-that-already-has-it/#comment-7

Here's some code that demonstrates this.

class Foo
def answer
42
end
end

module Bar
def answer
"What was the question?"
end

def to_s
"bar"
end
end

Foo.send :include, Bar
f = Foo.new
f.answer # => 42, not "What was the question?"
f.to_s # => "bar", not "#<Foo:0x731248>"


Why aren't existing methods overridden? And where could I have
looked to find out the answer for myself (perhaps somewhere in Ruby's
source?)?

Thanks and regards,
Andy

-------
http://airbladesoftware.com




 
Reply With Quote
 
 
 
 
Robert Klemme
Guest
Posts: n/a
 
      01-15-2008
On 15.01.2008 18:32, Andrew Stewart wrote:
> Hi Everyone,
>
> I believe one can add methods to a class by including a module but
> not override existing methods. Indeed Dr Nic said as much here:
>
> http://ruby.tie-rack.org/6/safely-ov..._missing-in-a-
> class-that-already-has-it/#comment-7
>
> Here's some code that demonstrates this.
>
> class Foo
> def answer
> 42
> end
> end
>
> module Bar
> def answer
> "What was the question?"
> end
>
> def to_s
> "bar"
> end
> end
>
> Foo.send :include, Bar
> f = Foo.new
> f.answer # => 42, not "What was the question?"
> f.to_s # => "bar", not "#<Foo:0x731248>"
>
>
> Why aren't existing methods overridden? And where could I have
> looked to find out the answer for myself (perhaps somewhere in Ruby's
> source?)?


Because of the position in the inheritance hierarchy:

irb(main):001:0> module Bar;end
=> nil
irb(main):002:0> class Foo
irb(main):003:1> include Bar
irb(main):004:1> end
=> Foo
irb(main):005:0> Foo.ancestors
=> [Foo, Bar, Object, Kernel]

Methods defined in Foo are always found before their counterparts in
included modules. Consequently you can override super class methods
with a module.

Kind regards

robert
 
Reply With Quote
 
 
 
 
Andrew Stewart
Guest
Posts: n/a
 
      01-15-2008

On 15 Jan 2008, at 17:40, Robert Klemme wrote:
> Because of the position in the inheritance hierarchy:
>
> irb(main):001:0> module Bar;end
> => nil
> irb(main):002:0> class Foo
> irb(main):003:1> include Bar
> irb(main):004:1> end
> => Foo
> irb(main):005:0> Foo.ancestors
> => [Foo, Bar, Object, Kernel]
>
> Methods defined in Foo are always found before their counterparts
> in included modules. Consequently you can override super class
> methods with a module.


Aha, of course. Thank you for the clear explanation.

I really should have worked that one out myself!

With regards,
Andy Stewart

-------
http://airbladesoftware.com




 
Reply With Quote
 
Jens Wille
Guest
Posts: n/a
 
      01-15-2008
hi andrew!

Andrew Stewart [2008-01-15 18:32]:
> I believe one can add methods to a class by including a module
> but not override existing methods.

well, you *can* override them explicitly:

module Bar
def self.included(base)
methods_to_override = %w[answer]
# or even <tt>instance_methods(false)</tt>

methods_to_override.each { |method|
base.send(:define_method, method, instance_method(method))
}
end
end

if that's what you want...

cheers
jens

--
Jens Wille, Dipl.-Bibl. (FH)
prometheus - Das verteilte digitale Bildarchiv für Forschung & Lehre
Kunsthistorisches Institut der Universität zu Köln
Albertus-Magnus-Platz, D-50923 Köln
Tel.: +49 (0)221 470-6668, E-Mail: http://www.velocityreviews.com/forums/(E-Mail Removed)
http://www.prometheus-bildarchiv.de/

 
Reply With Quote
 
Robert Klemme
Guest
Posts: n/a
 
      01-15-2008
On 15.01.2008 19:10, Andrew Stewart wrote:
> On 15 Jan 2008, at 17:40, Robert Klemme wrote:
>> Because of the position in the inheritance hierarchy:
>>
>> irb(main):001:0> module Bar;end
>> => nil
>> irb(main):002:0> class Foo
>> irb(main):003:1> include Bar
>> irb(main):004:1> end
>> => Foo
>> irb(main):005:0> Foo.ancestors
>> => [Foo, Bar, Object, Kernel]
>>
>> Methods defined in Foo are always found before their counterparts
>> in included modules. Consequently you can override super class
>> methods with a module.

>
> Aha, of course. Thank you for the clear explanation.


You're welcome!

> I really should have worked that one out myself!


Ah, no worries. Once in a while this just happens to all of us.

Btw, you got a nice website there (with a typo on the vortex page *g*).

Kind regards

robert
 
Reply With Quote
 
Jeremy McAnally
Guest
Posts: n/a
 
      01-15-2008
Where is this at? This is one of the most vague job listings I've ever seen.

I'm assuming Seattle?

--Jeremy

On Jan 15, 2008 1:29 PM, Scot H. Baker <(E-Mail Removed)> wrote:
>
> Are you a talented Ruby on Rails or mod_perl Developer looking for an
> exciting opportunity? My client runs a leading enthusiasts
> community/e-commerce site and they need your expertise to create new
> features and functions related to social networking. This is a great
> opportunity to work with a fun group and contribute to exciting
> technology that's used by many!
>
> Qualifications:
>
> * Thorough understanding of object-oriented methodology
> * Thorough understanding of MVC architectures
> * Experience with coding database-backed web applications
> * Expert knowledge in either mod_perl or Ruby on Rails
> * Intermediate knowledge of a mod_perl templating language
> * Intermediate CSS and Javascript skills
> * Willingness to work in an Agile development environment
> * Ability to clearly and concisely communicate technical ideas
>
> If you are interested or know someone that is interested please have
> them email a resume as a Word attachment to (E-Mail Removed) or
> (E-Mail Removed)
>
> Thanks!
> Scot Baker
> Technical Recruiting Manager
> parker technical
> 605 Fifth Avenue South -Suite 850- Seattle, WA 98104
> (E-Mail Removed) | p: 206-652-1587 | f: 206-223-8227 |
> c:206-915-9020
> http://www.linkedin.com/in/scotbaker
>
>
>
>




--
http://www.jeremymcanally.com/

My books:
Ruby in Practice
http://www.manning.com/mcanally/

My free Ruby e-book
http://www.humblelittlerubybook.com/

My blogs:
http://www.mrneighborly.com/
http://www.rubyinpractice.com/

 
Reply With Quote
 
ara.t.howard
Guest
Posts: n/a
 
      01-15-2008

On Jan 15, 2008, at 10:32 AM, Andrew Stewart wrote:

> Hi Everyone,
>
> I believe one can add methods to a class by including a module but
> not override existing methods. Indeed Dr Nic said as much here:
>
> http://ruby.tie-rack.org/6/safely-ov..._missing-in-a-
> class-that-already-has-it/#comment-7




i personally avoid aliases like that - they stack when you double
require or double include a module and throw into a loop. this kind
of thing can be done safely and generically using a variable for the
previous method that's protected from the gc and a lookup in the new
method:



cfp:~ > cat a.rb
class A
def foo
p "A.foo"
end
end
class B
end

module M
NoGC = []

def self.included other
other.module_eval do
if((foo = instance_method 'foo' rescue false))
NoGC.push foo
supra = "ObjectSpace._id2ref(#{ foo.object_id }).bind
(self).call(*a, &b)"
end
eval <<-code
def foo *a, &b
#{ supra }
p "M.foo"
end
code
end
end
end

A.send :include, M
B.send :include, M

A.new.foo
B.new.foo


cfp:~ > ruby a.rb
"A.foo"
"M.foo"
"M.foo"


this allows you to both override and super up, in any combination,
with a method injected late into a class hierarchy


kind regards


a @ http://codeforpeople.com/
--
it is not enough to be compassionate. you must act.
h.h. the 14th dalai lama




 
Reply With Quote
 
Glen Holcomb
Guest
Posts: n/a
 
      01-15-2008
[Note: parts of this message were removed to make it a legal post.]

As long as it's close to a Soup Kitchen they have the free lunch thing
covered.

On Jan 15, 2008 12:19 PM, Jeremy McAnally <(E-Mail Removed)> wrote:

> Where is this at? This is one of the most vague job listings I've ever
> seen.
>
> I'm assuming Seattle?
>
> --Jeremy
>
> On Jan 15, 2008 1:29 PM, Scot H. Baker <(E-Mail Removed)> wrote:
> >
> > Are you a talented Ruby on Rails or mod_perl Developer looking for an
> > exciting opportunity? My client runs a leading enthusiasts
> > community/e-commerce site and they need your expertise to create new
> > features and functions related to social networking. This is a great
> > opportunity to work with a fun group and contribute to exciting
> > technology that's used by many!
> >
> > Qualifications:
> >
> > * Thorough understanding of object-oriented methodology
> > * Thorough understanding of MVC architectures
> > * Experience with coding database-backed web applications
> > * Expert knowledge in either mod_perl or Ruby on Rails
> > * Intermediate knowledge of a mod_perl templating language
> > * Intermediate CSS and Javascript skills
> > * Willingness to work in an Agile development environment
> > * Ability to clearly and concisely communicate technical ideas
> >
> > If you are interested or know someone that is interested please have
> > them email a resume as a Word attachment to (E-Mail Removed) or
> > (E-Mail Removed)
> >
> > Thanks!
> > Scot Baker
> > Technical Recruiting Manager
> > parker technical
> > 605 Fifth Avenue South -Suite 850- Seattle, WA 98104
> > (E-Mail Removed) | p: 206-652-1587 | f: 206-223-8227 |
> > c:206-915-9020
> > http://www.linkedin.com/in/scotbaker
> >
> >
> >
> >

>
>
>
> --
> http://www.jeremymcanally.com/
>
> My books:
> Ruby in Practice
> http://www.manning.com/mcanally/
>
> My free Ruby e-book
> http://www.humblelittlerubybook.com/
>
> My blogs:
> http://www.mrneighborly.com/
> http://www.rubyinpractice.com/
>
>



--
"Hey brother Christian with your high and mighty errand, Your actions speak
so loud, I can't hear a word you're saying."

-Greg Graffin (Bad Religion)

 
Reply With Quote
 
Robert Dober
Guest
Posts: n/a
 
      01-15-2008
On Jan 15, 2008 8:33 PM, ara.t.howard <(E-Mail Removed)> wrote:

> this allows you to both override and super up, in any combination,
> with a method injected late into a class hierarchy

Actually whenever these issues come up I wonder why we still define
methods in classes?
Either, using pure Ruby implementening all functionality im Modules
(with the dangerous pitfall of double inclusion, or just using Traits
Composition would just end all of that kind of complexity) But even I
do not use my Traits package, old habits are difficult to lose
indeed....
Cheers
Robert
--
http://ruby-smalltalk.blogspot.com/

---
Whereof one cannot speak, thereof one must be silent.
Ludwig Wittgenstein

 
Reply With Quote
 
Andrew Stewart
Guest
Posts: n/a
 
      01-16-2008

On 15 Jan 2008, at 18:15, Jens Wille wrote:
> well, you *can* override them explicitly:
>
> module Bar
> def self.included(base)
> methods_to_override = %w[answer]
> # or even <tt>instance_methods(false)</tt>
>
> methods_to_override.each { |method|
> base.send(:define_method, method, instance_method(method))
> }
> end
> end
>
> if that's what you want...


There's always a way! Thanks Jens, that's neat.

Regards,
Andy Stewart

-------
http://airbladesoftware.com




 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Mixin a module method as a class method Farrel Lifson Ruby 9 10-19-2006 12:06 PM
How safe: overridding require Trans Ruby 4 08-08-2005 01:12 PM
MixIn method to call the method it overrides: how? Mac Python 1 06-18-2005 02:30 PM
overridding webcontrols property programmatically gane kol ASP .Net 1 04-15-2005 12:04 AM
overridding factories. Roedy Green Java 0 08-24-2003 08:55 PM



Advertisments