Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Ruby > Mixin of class methods?

Reply
Thread Tools

Mixin of class methods?

 
 
Michael Roth
Guest
Posts: n/a
 
      09-24-2005
Hello all,

I'm a little bit new to the wonderful world of ruby and have a small
problem. I would like to mixin a module method:

module M
def M.foobar id
puts "Hello Ruby: #{id}"
end
end

class C
include M
foobar :example
end

But that doesn't work. I'm trying to write some helper class methods
like attr_accessor and friends.

I don't like to write

class C
include M
M.foobar :example
end

because 'M' has to many chars to type...
My helper class methods should look like attr_accessor and friends.

What is the right way to solve this problem?


Michael Roth

 
Reply With Quote
 
 
 
 
Kevin Ballard
Guest
Posts: n/a
 
      09-24-2005
module M
def foobar(id)
puts "Hello Ruby: #{id}"
end
end

class C
class << self
include M
end
foobar :example
end

 
Reply With Quote
 
 
 
 
Jeremy Kemper
Guest
Posts: n/a
 
      09-24-2005
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On Sep 24, 2005, at 1:56 PM, Michael Roth wrote:
> I'm a little bit new to the wonderful world of ruby and have a small
> problem. I would like to mixin a module method:
>
> module M
> def M.foobar id
> puts "Hello Ruby: #{id}"
> end
> end
>
> class C
> include M
> foobar :example
> end


module M
def foobar id
puts "Hello Ruby: #{id}"
end
end

class C
extend M
foobar :example
end

OR if you'd like M to have both instance and class methods:

module M
def self.included(base)
super
base.extend ClassMethods
end

def baz
# ...
end

module ClassMethods
def foobar id
# ...
end
end
end

class C
include M
foobar :example
end

C.new.baz

Modules are pleasant little beasts.

Best,
jeremy
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.2 (Darwin)

iD8DBQFDNcDfAQHALep9HFYRAsQNAKCG5eMkzpBIjNkc0Tk4qD cMI/UEHQCg1HF2
rpdtYLov7fyKH9+SC24VU2c=
=4RK9
-----END PGP SIGNATURE-----


 
Reply With Quote
 
Michael Roth
Guest
Posts: n/a
 
      09-24-2005
Kevin Ballard wrote:

> class C
> class << self
> include M
> end
> foobar :example
> end


Thank you very much.

Hmm, the 'class <<' thing creates an singleton class. Looks like I
should take some time to read some more pages from the ruby book...


Michael Roth
 
Reply With Quote
 
Michael Roth
Guest
Posts: n/a
 
      09-24-2005
Jeremy Kemper wrote:

> class C
> extend M
> foobar :example
> end


This looks very nice. Thank you!


> Modules are pleasant little beasts.


Oh yes...


Michael Roth
 
Reply With Quote
 
Ara.T.Howard
Guest
Posts: n/a
 
      09-24-2005
On Sun, 25 Sep 2005, Michael Roth wrote:

> Hello all,
>
> I'm a little bit new to the wonderful world of ruby and have a small
> problem. I would like to mixin a module method:
>
> module M
> def M.foobar id
> puts "Hello Ruby: #{id}"
> end
> end
>
> class C
> include M
> foobar :example
> end
>
> But that doesn't work. I'm trying to write some helper class methods
> like attr_accessor and friends.
>
> I don't like to write
>
> class C
> include M
> M.foobar :example
> end
>
> because 'M' has to many chars to type...
> My helper class methods should look like attr_accessor and friends.
>
> What is the right way to solve this problem?


i think this is clearest for people reading your code:

module M
module InstanceMethods
end
module ClassMethods
end
def self::included other
other.module_eval{ include InstanceMethods }
other.extend ClassMethods
other
end
end

class C
include M
end

but it's an opinion...

-a
--
================================================== =============================
| email :: ara [dot] t [dot] howard [at] noaa [dot] gov
| phone :: 303.497.6469
| Your life dwells amoung the causes of death
| Like a lamp standing in a strong breeze. --Nagarjuna
================================================== =============================

 
Reply With Quote
 
michele
Guest
Posts: n/a
 
      09-25-2005
How about:

class Module
def foobar id
puts "Hello Ruby: #{id}"
end
end

class C
foobar :example
end

my_c = C.new

 
Reply With Quote
 
Sean O'Halpin
Guest
Posts: n/a
 
      09-25-2005
On 9/25/05, michele <> wrote:
> How about:
>
> class Module
> def foobar id
> puts "Hello Ruby: #{id}"
> end
> end
>
> class C
> foobar :example
> end
>
> my_c =3D C.new
>

This is fine if you want to add the foobar method to ~all~ classes and
modules. I'd recommend Ara's way if you want to be more selective
about which classes get the methods.

Sean


 
Reply With Quote
 
michele
Guest
Posts: n/a
 
      09-26-2005
> module M
> module InstanceMethods
> end
> module ClassMethods
> end
> def self::included other
> other.module_eval{ include InstanceMethods }
> other.extend ClassMethods
> other <------------------?
> end
> end
>
> class C
> include M
> end


Why the "other" return (see question mark above)? It seems to work
without.

 
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 module with class variables and class methods John Lane Ruby 6 02-09-2010 09:48 PM
Pending: A Mixin class for testing Scott David Daniels Python 1 11-27-2006 08:32 AM
Mixin class error Ed Leafe Python 3 03-07-2006 01:44 AM
mixin helper class for unknown attribute access? Alex Hunsley Python 6 10-31-2005 03:00 PM
mixin class Udo Gleich Python 5 07-31-2003 03:42 AM



Advertisments