Require just in a context?


#1

Can I make some libraray just work in a context ?

I add a new ruby file into my app using “require ‘mathn’” but i don’t
want every ruby file to use the ‘mathn’, how can I do it?


#2

E. Saynatkari wrote:

(see the docs) or a library such as Script (see RAA) which
uses a named module. This approach might not work with mathn
or anything else that modifies existing classes.

Nope. If you Kernel#load or Module#module_eval a file which requires
mathn, the effect will still be global.

$ ruby -e ‘load “foo.rb”; p 1/2’
1/2
$ ruby -e ‘m=Module.new; m.module_eval(File.read(“foo.rb”)); p 1/2’
1/2
$ ruby -v
ruby 1.8.4 (2005-12-24) [i686-linux]

I think what you want is something called behaviors. See the list
archives…


#3

cap wrote:

Can I make some libraray just work in a context ?

I add a new ruby file into my app using “require ‘mathn’” but i don’t
want every ruby file to use the ‘mathn’, how can I do it?

Well, anytime you call #require, the effect will be global.
You can delay the call until a certain point in your program
(possibly useful if there is a possibility that it would not
be loaded at all) since #require is just a method. For example,

def foobar(x, y)
require ‘mathn’
# …
end

Would be fine (but would still have an effect just like if
you did it at the top of the file).

As an alternative, you could wrap the loaded file into a
module either using #load which can use an anonymous module
(see the docs) or a library such as Script (see RAA) which
uses a named module. This approach might not work with mathn
or anything else that modifies existing classes.

E