require and include??

R

rantingrick

Hello,

I am having trouble understanding the difference between require and
include. Also i need to know how to import a certain function or class
into my current namespace.

Now before i go any further i should explain that i am a Python
programmer and i understand that whilst Ruby and Python share some
similarities there are major differences between the languages, and
that is what seems to have me stumped here.

In python we use the "import" statement to bring modules, functions,
whatever. And the import statement can function in many ways,
observe...

if i want to bring all the names from the math module into my current
namespace without the need to qualify the names i can say...(note:
dir() shows the current namespace!)
dir() ['__builtins__', '__doc__', '__name__', '__package__']
from math import *
dir()
['__builtins__', '__doc__', '__name__', '__package__', 'acos',
'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil',
'copysign', 'cos', 'cosh', 'degrees', 'e', 'exp', 'fabs', 'factorial',
'floor', 'fmod', 'frexp', 'fsum', 'hypot', 'isinf', 'isnan', 'ldexp',
'log', 'log10', 'log1p', 'modf', 'pi', 'pow', 'radians', 'sin',
'sinh', 'sqrt', 'tan', 'tanh', 'trunc']5.0

Now if i want to just use a certain function, class, constant, i can
call for just those specific names like...
dir() ['__builtins__', '__doc__', '__name__', '__package__']
from math import hypot, pi
dir() ['__builtins__', '__doc__', '__name__', '__package__', 'hypot', 'pi']
pi 3.1415926535897931
hypot(3,4) 5.0

Now if i want to bring a reference to the module in and then qualify
every thing within the module by perpending the
"module_name.identifier" i can say...
import math
dir() ['__builtins__', '__doc__', '__name__', '__package__', 'math']
math.hypot(3,4)
5.0

Ok, i know Ruby is different, so tell me how i do the same thing only
in Ruby terms. Specifically i need to bring in a function that resides
in a module in a different file. How do i do this?
 
S

Steve Howell

Hello,

I am having trouble understanding the difference between require and
include. Also i need to know how to import a certain function or class
into my current namespace.

Now before i go any further i should explain that i am a Python
programmer and i understand that whilst Ruby and Python share some
similarities there are major differences between the languages,  and
that is what seems to have me stumped here.
[...]

Ok, i know Ruby is different, so tell me how i do the same thing only
in Ruby terms. Specifically i need to bring in a function that resides
in a module in a different file. How do i do this?

I can relate to your situation, since I also come from a Python
background. It is probably good to read up on docs a bit, but you
might also find the following examples useful for experimentation.

I think the answer to your specific question is shown by the use of
Hello2::hello_world2() below. Note that it is hello2.rb that actually
"namespaces" the function (and makes it a public module function), not
the act of calling "require" itself. This is very different from
Python, of course.

::::::::::::::
foo.rb
::::::::::::::
# require without modules
require 'hello1'
hello_world1()

# require with modules in the
# other file (see hello2.rb)
require 'hello2'
Hello2::hello_world2()

# re-opening module
module Hello2
def goodbye()
puts 'goodbye'
end
module_function :goodbye
end
Hello2::goodbye()

# on-the-fly modules
hello3 = Module.new do
def hello_world3()
puts 'hello world 3'
end
module_function :hello_world3

def obj_method()
puts 'obj_method'
end
end

hello3::hello_world3()
obj = 'foo'
obj.extend(hello3)
obj.obj_method()


::::::::::::::
hello1.rb
::::::::::::::
def hello_world1
puts 'hello world 1'
end

::::::::::::::
hello2.rb
::::::::::::::
module Hello2
def hello_world2
puts 'hello world 2'
end
module_function :hello_world2
end
 
J

Javier Abaroa

Hello,

Ruby is different of other languages as php. In php, "include" an
"require" put the content of a the file "called" into the "caller" file.

Ruby "require" statement is analogous to php statement and put the
content of "called" file into "caller". But ruby "include" statement is
for include one "module" that is in a "yet required file" into a class
of the actual file.

If you intend to make reference in a class of your actual script-file to
a module in other file, normally you have to make the following:

# called file - name hello.rb

module Called {
def Called.Hello() # Defines Function Hello of Module Called
puts "hello"
end
}

# caller file - name caller.rb

require "hello.rb"

class MyClass
}
include Called # Includes Module Called into MyClass
def MyHello()
Called.Hello() # Execute function Hello of Module "Called"
end
}

MyVar = MyClass.new() # Create a new MyClass Object
MyVar.MyHello() # Execute function MyHello for MyVar, calling the
function Called.Hello()



Javier Abaroa
Hello,

I am having trouble understanding the difference between require and
include. Also i need to know how to import a certain function or class
into my current namespace.

Now before i go any further i should explain that i am a Python
programmer and i understand that whilst Ruby and Python share some
similarities there are major differences between the languages, and
that is what seems to have me stumped here.

In python we use the "import" statement to bring modules, functions,
whatever. And the import statement can function in many ways,
observe...

if i want to bring all the names from the math module into my current
namespace without the need to qualify the names i can say...(note:
dir() shows the current namespace!)
dir() ['__builtins__', '__doc__', '__name__', '__package__']
from math import *
dir()
['__builtins__', '__doc__', '__name__', '__package__', 'acos',
'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil',
'copysign', 'cos', 'cosh', 'degrees', 'e', 'exp', 'fabs', 'factorial',
'floor', 'fmod', 'frexp', 'fsum', 'hypot', 'isinf', 'isnan', 'ldexp',
'log', 'log10', 'log1p', 'modf', 'pi', 'pow', 'radians', 'sin',
'sinh', 'sqrt', 'tan', 'tanh', 'trunc']5.0

Now if i want to just use a certain function, class, constant, i can
call for just those specific names like...
dir() ['__builtins__', '__doc__', '__name__', '__package__']
from math import hypot, pi
dir() ['__builtins__', '__doc__', '__name__', '__package__', 'hypot', 'pi']
pi 3.1415926535897931
hypot(3,4) 5.0

Now if i want to bring a reference to the module in and then qualify
every thing within the module by perpending the
"module_name.identifier" i can say...
import math
dir() ['__builtins__', '__doc__', '__name__', '__package__', 'math']
math.hypot(3,4)
5.0

Ok, i know Ruby is different, so tell me how i do the same thing only
in Ruby terms. Specifically i need to bring in a function that resides
in a module in a different file. How do i do this?
 
J

jbw

Hello,

I am having trouble understanding the difference between require and
include. Also i need to know how to import a certain function or class
into my current namespace.

http://ruby-doc.org/docs/ProgrammingRuby/html/tut_modules.html
This might clear things up, but to summarise include adds methods,
require adds modules.

Now before i go any further i should explain that i am a Python
programmer and i understand that whilst Ruby and Python share some
similarities there are major differences between the languages, =C2=A0and
that is what seems to have me stumped here.

In python we use the "import" statement to bring modules, =C2=A0functions= ,
whatever. And the import statement can function in many ways,
observe...

if i want to bring all the names from the math module into my current
namespace without the need to qualify the names i can say...(note:
dir() shows the current namespace!)
dir() ['__builtins__', '__doc__', '__name__', '__package__']
from math import *
dir()
['__builtins__', '__doc__', '__name__', '__package__', 'acos',
'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil',
'copysign', 'cos', 'cosh', 'degrees', 'e', 'exp', 'fabs', 'factorial',
'floor', 'fmod', 'frexp', 'fsum', 'hypot', 'isinf', 'isnan', 'ldexp',
'log', 'log10', 'log1p', 'modf', 'pi', 'pow', 'radians', 'sin',
'sinh', 'sqrt', 'tan', 'tanh', 'trunc']5.0

Now if i want to just use a certain function, class, constant, i can
call for just those specific names like...

Not sure there is a clean way to do this.
dir() ['__builtins__', '__doc__', '__name__', '__package__']
from math import hypot, pi
dir() ['__builtins__', '__doc__', '__name__', '__package__', 'hypot', 'pi']
pi 3.1415926535897931
hypot(3,4) 5.0

Now if i want to bring a reference to the module in and then qualify
every thing within the module by perpending the
"module_name.identifier" i can say...
import math
dir() ['__builtins__', '__doc__', '__name__', '__package__', 'math']
math.hypot(3,4)
5.0

Ok, i know Ruby is different, so tell me how i do the same thing only
in Ruby terms. Specifically i need to bring in a function that resides
in a module in a different file. How do i do this?
 
R

rantingrick

(..snip..)

Thanks Steve that did it. I just used 'require "pathtofile"' and
called 'module::function()' and voila!

Thanks everyone the responses, i learned a great deal from all of them!
 
J

Javier Abaroa

Hello,

But the alternative is to make a "require" into the script-file to
import the modules, and a "include module-name" into a class definition
to import all of the module-methods into that class.

Javier Abaroa.
 
R

rantingrick

Hello,

But the alternative is to make a "require" into the script-file to
import the modules, and a "include module-name" into a class definition
to import all of the module-methods into that class.

Javier Abaroa.

Thanks Javier! I did look into this also. It is interesting how you
can use include inside a class definition to bring in certain
functions. As soon as i get a good grasp on this concept i will
probably implement it in many scripts. Thanks.

PS: i made a typo... "module::function()" should have been
"module.function()". Which is also weird because the two are sometimes
interchangeable and sometimes not?
 
B

Brian Candler

jbw said:
This might clear things up, but to summarise include adds methods,
require adds modules.

That is almost completely inaccurate, I'm afraid.

'require' loads and executes code. For example,

require "foo"

looks for foo.rb or foo.so in the $LOAD_PATH and then loads and executes
it. (Actually, it first looks in $LOADED_FEATURES to see if it has
already been loaded, and passes if it has. Use 'load' to load and
execute unconditionally)

foo.rb *might* contain code which defines modules and/or classes, but it
doesn't have to. require doesn't care, it just executes whatever is in
there.

$ cat foo.rb
puts "hello world"

$ irb --simple-prompthello world
=> true

'include' is used to add the instance methods of a module into a class.

$ irb --simple-prompthello world
=> nil
It also works at the 'top level', which is probably what you're thinking
of.
=> 3.0

Notice that 'include' takes a Module as its argument, whereas 'require'
takes a String (which is the filename to load).
 

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,954
Messages
2,570,116
Members
46,704
Latest member
BernadineF

Latest Threads

Top