Using Fixnum, Strings etc. in Modules

B

Bram Wijnands

I'm stuck on why this occurs. (using jRuby 1.1.5 & Ruby 1.8.6)

I'm trying to use modules to scope certain class overrides, so say the
String class is changed in ModuleA i don't want it to affect ModuleB.
But when i try to accomplish this i run in to two things.

First, when creating a Module and overwriting, just for example, the
reverse method. results in an error:
module ModuleA
class String; def reverse;false;end; end
p String.new("abc").reverse
end

Okay, so it creates its own class String instead of taking the core
class String. Basicly what i want is the module to have it's own set of
core classes.

Secondly, when using direct instantiation in a module it wont use the
overwritten class, example:
module ModuleA
class String < String; def reverse;false;end; end
p String.new("abc").reverse
p "abc".reverse
end

Results in:
false
cba
Instead of false; false

Could anyone point me in the right drection, thanks in advanced !
 
C

Christopher Dicely

I'm stuck on why this occurs. (using jRuby 1.1.5 & Ruby 1.8.6)

I'm trying to use modules to scope certain class overrides, so say the
String class is changed in ModuleA i don't want it to affect ModuleB.
But when i try to accomplish this i run in to two things.

First, when creating a Module and overwriting, just for example, the
reverse method. results in an error:
module ModuleA
class String; def reverse;false;end; end
=C2=A0p String.new("abc").reverse
end

Okay, so it creates its own class String instead of taking the core
class String. Basicly what i want is the module to have it's own set of
core classes.

Secondly, when using direct instantiation in a module it wont use the
overwritten class, example:
module ModuleA
class String < String; def reverse;false;end; end
p String.new("abc").reverse
p "abc".reverse
end

Results in:
false
cba
Instead of false; false

Could anyone point me in the right drection, thanks in advanced !

I don't think its possible to do exactly what you are trying to do
without fundamentally altering the core of Ruby: you can't, as far as
I know, alter a class only for purposes of calls from a particular
module, and literals will always use the top level class :):String,
etc.) not <CurrentModule>::String. As your code above shows, you can
just avoid using literals and always use explicit constructor calls in
your module to use the local version.
 
R

Robert Klemme

2009/3/18 Christopher Dicely said:
I don't think its possible to do exactly what you are trying to do
without fundamentally altering the core of Ruby: you can't, as far as
I know, alter a class only for purposes of calls from a particular
module, and literals will always use the =A0top level class :):String,
etc.) not <CurrentModule>::String. As your code above shows, you can
just avoid using literals and always use explicit constructor calls in
your module to use the local version.

Absolutely agree! Fiddling with core classes is a bad idea(TM).

And you cannot alter the return type of String constructors "" and ''.

Another solution is to use a functional approach

module A
def self.reverse(str)
false
end
end

You could as well use delegation to wrap core classes with other
classes and add / change functionality. That's probably the most OO
approach. Changing core classes brings all sorts of problems and I
strongly suggest to not do it.

Cheers

robert

--=20
remember.guy do |as, often| as.you_can - without end
 

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

Members online

No members online now.

Forum statistics

Threads
473,801
Messages
2,569,658
Members
45,421
Latest member
DoreenCorn

Latest Threads

Top