How does Ruby handle namespace?

Z

Zhao Yi

In Java, it uses import to include other classes from other packages. In
ruby, I only found that require statement can do this. When the ruby
scripts are located in different directories, I have to use the "../../"
to indicate these dependency directories. Is there a standard or better
way to declares package? Does ruby have something like CLASSPATH in
Java?
 
E

Einar Magnús Boson

commandline:

ruby -I includedir1:includedir2:etc app.rb
(i.e "i".upcase)

in ruby $: holds the include path

In Java, it uses import to include other classes from other =20
packages. In
ruby, I only found that require statement can do this. When the ruby
scripts are located in different directories, I have to use the =20
"../../"
to indicate these dependency directories. Is there a standard or =20
better
way to declares package? Does ruby have something like CLASSPATH in
Java?
--=20
Posted via http://www.ruby-forum.com/.


Einar Magn=FAs Boson
+354-661 1649
(e-mail address removed)
(e-mail address removed)
 
B

Brian Candler

I'd say it's probably quicker to read the Ruby documentation on these
topics, rather than asking how Java is different, because Java *is*
different.

A good start is http://www.ruby-doc.org/docs/ProgrammingRuby/ - this is
the free, 1st edition of the "Pickaxe" Programming Ruby book, written
for ruby 1.6.

There is now a revised 2nd edition for 1.8, and the 3rd edition for 1.9
is in beta. These are available from bookshops or www.pragprog.com (in
PDF, book, or combo pack)

The 1.6 stuff is pretty much still valid, it's just that 1.8 adds new
classes and methods.
In Java, it uses import to include other classes from other packages. In
ruby, I only found that require statement can do this. When the ruby
scripts are located in different directories, I have to use the "../../"
to indicate these dependency directories. Is there a standard or better
way to declares package? Does ruby have something like CLASSPATH in
Java?

In brief:

"require 'foo'" looks for file foo.rb, and loads and runs it (unless
foo.rb has already been loaded, in which case it's a no-op)

The search path is the array $LOAD_PATH (or $: for short), and the
record of which files have already been loaded is in $LOADED_FEATURES

Namespaces are handled entirely separately, using class and module
keywords. A Module defines a new namespace, and a Class is a Module
which can be instantiated to create objects.

How you organise your files is up to you, but it is conventional to have
a lib/ subdirectory for your project. Then

module Foo
class Bar
...
end
end

would typically be put into lib/foo/bar.rb

If you do this, then you can load it using

require 'foo/bar'
obj = Foo::Bar.new

All this requires is lib/ to be in your search path.

You can arrange this from the command line:

ruby -Ilib main.rb

or you can do something like this in your main program:

$LOAD_PATH.unshift(File.dirname(__FILE__)+"/lib")

If your main program is inside a bin/ directory then you'd do

$LOAD_PATH.unshift(File.dirname(__FILE__)+"/../lib")

HTH,

Brian.
 
T

Tony Lawetta

Zhao said:
When the ruby
scripts are located in different directories, I have to use the "../../"
to indicate these dependency directories. Is there a standard or better
way to declares package?

I usually add elements (path names) to the value of the Array "$:"
(variable name is without the double quotes).

Tony
 

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,769
Messages
2,569,581
Members
45,056
Latest member
GlycogenSupporthealth

Latest Threads

Top