Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   Ruby (http://www.velocityreviews.com/forums/f66-ruby.html)
-   -   Mixin of class methods? (http://www.velocityreviews.com/forums/t824685-mixin-of-class-methods.html)

Michael Roth 09-24-2005 08:54 PM

Mixin of class methods?
 
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


Kevin Ballard 09-24-2005 09:03 PM

Re: Mixin of class methods?
 
module M
def foobar(id)
puts "Hello Ruby: #{id}"
end
end

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


Jeremy Kemper 09-24-2005 09:10 PM

Re: Mixin of class methods?
 
-----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-----



Michael Roth 09-24-2005 09:22 PM

Re: Mixin of class methods?
 
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

Michael Roth 09-24-2005 09:29 PM

Re: Mixin of class methods?
 
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

Ara.T.Howard 09-24-2005 09:30 PM

Re: Mixin of class methods?
 
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
================================================== =============================


michele 09-25-2005 02:59 PM

Re: Mixin of class methods?
 
How about:

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

class C
foobar :example
end

my_c = C.new


Sean O'Halpin 09-25-2005 04:21 PM

Re: Mixin of class methods?
 
On 9/25/05, michele <michelemendel@gmail.com> 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



michele 09-26-2005 08:00 AM

Re: Mixin of class methods?
 
> 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.



All times are GMT. The time now is 09:06 AM.

Powered by vBulletin®. Copyright ©2000 - 2014, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.