# Using Fixnum, Strings etc. in Modules

**URL:** <https://www.ruby-forum.com/t/using-fixnum-strings-etc-in-modules/163232>\
**Category:** Ruby\
**Created:** [March 18, 2009, 2:13pm UTC](https://www.ruby-forum.com/t/using-fixnum-strings-etc-in-modules/163232 "2009-03-18T14:13:12Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![bramski](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/c2a13f/32.png) [@bramski](https://www.ruby-forum.com/u/bramski)\
**Post date:** [March 18, 2009, 2:13pm UTC](https://www.ruby-forum.com/t/using-fixnum-strings-etc-in-modules/163232/1 "2009-03-18T14:13:12Z")

</div>

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 !

---

<div class="post-metadata">

**Author:** ![bramski](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/c2a13f/32.png) [@bramski](https://www.ruby-forum.com/u/bramski)\
**Post date:** [March 18, 2009, 3:54pm UTC](https://www.ruby-forum.com/t/using-fixnum-strings-etc-in-modules/163232/2 "2009-03-18T15:54:13Z")

</div>

On Wed, Mar 18, 2009 at 6:10 AM, Bram W. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
wrote:

> Â p String.new(“abc”).reverse  
> 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 ::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.

---

<div class="post-metadata">

**Author:** ![bramski](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/c2a13f/32.png) [@bramski](https://www.ruby-forum.com/u/bramski)\
**Post date:** [March 18, 2009, 4:32pm UTC](https://www.ruby-forum.com/t/using-fixnum-strings-etc-in-modules/163232/3 "2009-03-18T16:32:01Z")

</div>

2009/3/18 Christopher D. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> > class String; def reverse;false;end; end  
> > class String \< String; def reverse;false;end; end
> 
> 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 ::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™.

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
