Class method aliasing

B

Bob Hutchison

Hi,

I'd like to confirm that I cannot use any kind of aliasing to tidy up
the following situation:

class Junk
def Junk.info
"blah blah blah"
end

def info
Junk.info
end
end

I'd really like to be able to write the following:

puts Junk.info

# then somewhere far from there...
junk = Junk.new
puts junk.info

I don't find junk.class.info satisfying, and if that were a module
method, then you have to know too much.

I guess what I'm trying to do is make class/module methods directly
available to instances, and it seems I can't do that (whatever the
reason).

Any better ideas are more than welcome.

Cheers,
Bob
 
A

Ara.T.Howard

Hi,

I'd like to confirm that I cannot use any kind of aliasing to tidy up the
following situation:

class Junk
def Junk.info
"blah blah blah"
end

def info
Junk.info
end
end

I'd really like to be able to write the following:

puts Junk.info

# then somewhere far from there...
junk = Junk.new
puts junk.info

I don't find junk.class.info satisfying, and if that were a module method,
then you have to know too much.

I guess what I'm trying to do is make class/module methods directly available
to instances, and it seems I can't do that (whatever the reason).

Any better ideas are more than welcome.

Cheers,
Bob

harp:~ > cat a.rb
class Module
def mod_attr a
module_eval <<-code
def #{ a }
self::class.send '#{ a }'
end
def #{ a }= value
self::class.send '#{ a }=', value
end
code
end
end

class C
def C::info
42
end
mod_attr 'info'
end

p C::info

p C::new.info


harp:~ > ruby a.rb
42
42


-a
--
===============================================================================
| email :: ara [dot] t [dot] howard [at] noaa [dot] gov
| phone :: 303.497.6469
| anything that contradicts experience and logic should be abandoned.
| -- h.h. the 14th dalai lama
===============================================================================
 
S

Sean O'Halpin

Hi,

I'd like to confirm that I cannot use any kind of aliasing to tidy up
the following situation:

[snip example - see below]
I guess what I'm trying to do is make class/module methods directly
available to instances, and it seems I can't do that (whatever the
reason).

Any better ideas are more than welcome.

Cheers,
Bob

How about this?

class Class
def class_function(name)
class_eval { define_method(name, &method(name)) }
end
end

class Junk
def Junk.info
"blah blah blah from #{self}"
end

class_function :info
end

puts Junk.info
junk =3D Junk.new
puts junk.info
__END__
blah blah blah from Junk
blah blah blah from Junk

Regards,

Sean
 
S

Sean O'Halpin

Though maybe class_function isn't the right name. Perhaps
instance_function or object_function? (All on analogy with
module_function). Also, it might be handy to do this:

class Class
def instance_function(*names)
names.each do |name|
class_eval { define_method(name, &method(name)) }
end
end
end

so you can do this:

instance_function :info, :hello

Regards,

Sean
 
R

Robert Klemme

Bob said:
Hi,

I'd like to confirm that I cannot use any kind of aliasing to tidy up
the following situation:

class Junk
def Junk.info
"blah blah blah"
end

def info
Junk.info
end
end

I'd really like to be able to write the following:

puts Junk.info

# then somewhere far from there...
junk = Junk.new
puts junk.info

I don't find junk.class.info satisfying, and if that were a module
method, then you have to know too much.

I guess what I'm trying to do is make class/module methods directly
available to instances, and it seems I can't do that (whatever the
reason).

Any better ideas are more than welcome.

Here's another approach:

module Helper
def info() 42 end
end
class Foo
include Helper
extend Helper
end
=> 42

Kind regards

robert
 
B

Bob Hutchison

Thanks! I think a variation of Ara's and Sean's suggestion with
your's Robert cover the various circumstances I've got to deal with.

Cheers,
Bob
 
E

ES

Bob said:
Thanks! I think a variation of Ara's and Sean's suggestion with your's
Robert cover the various circumstances I've got to deal with.

You can automate things a bit (thanks to bitsweat for helping me find
singleton_method_added again). Here is a version which enables you to
easily control which classes have this feature:


module ParentalControls
module ClassIncludes
def singleton_method_added(sym)
class_eval <<-END
def #{sym}(*a, &b)
self.class.#{sym}(*a, &b)
end
END
end
end

def self.included(mod)
mod.extend ClassIncludes
end
end

class Foo
include ParentalControls

def self.foo()
42
end
end

puts Foo.foo
puts Foo.new.foo
Cheers,
Bob

E
 

Ask a Question

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

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Similar Threads


Members online

No members online now.

Forum statistics

Threads
473,995
Messages
2,570,228
Members
46,818
Latest member
SapanaCarpetStudio

Latest Threads

Top