Forum: Ruby new to ruby, "requier" not working?

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
David Just (Guest)
on 2005-12-29 06:17
(Received via mailing list)
Hello,

	I'm trying to learn ruby from the Poignant guide to Ruby
(http://poignantguide.net/ruby/chapter-4.html) and have run into a
problem.   In chapter 4 the simple word replacement example is the
first use of the require statement.   It does not work for me.   I'm on
OS 10.3,  ruby 1.8.2 and my directory structure is :

~/projects/test.rb
~/projects/wordlist.rb


test.rb starts with:
require 'wordlist'

and wordlist.rb just has:
words  = {
    'starmonkeys' => 'Phil and Pete, those prickly chancellors of the
New Reich',
    'catapult' => 'chucky go-go', 'firebomb' => 'Heat-Assisted Living',
    'Nigeria' => "Ny and Jerry's Dry Cleaning (with Donuts)",
    'Put the kabosh on' => 'Put the cable box on'
  }

When i try and run test.rb it says that words is an undefined variable.
If i put the definition of words directly into the test.rb file it
works just fine.

I'm really frustrated with this so i could really use some advice.
I've tried all the permutations of require "wordlist",  require
"wordlist.rb"  require 'wordlist.rb'   require "./wordlist.rb"  and
nothing works.  I can't get much farther until i figure out how to get
require working.

Thanks,
Dave.
Archie C. (Guest)
on 2005-12-29 07:21
> ~/projects/test.rb
> ~/projects/wordlist.rb
>
>
> test.rb starts with:
> require 'wordlist'
>
> and wordlist.rb just has:
> words  = {
>     'starmonkeys' => 'Phil and Pete, those prickly chancellors of the
> New Reich',
>     'catapult' => 'chucky go-go', 'firebomb' => 'Heat-Assisted Living',
>     'Nigeria' => "Ny and Jerry's Dry Cleaning (with Donuts)",
>     'Put the kabosh on' => 'Put the cable box on'
>   }
>
> When i try and run test.rb it says that words is an undefined variable.
> If i put the definition of words directly into the test.rb file it
> works just fine.

Dave,  I am a newbie also.  From the manual "require" and "load" are
similar.  Maybe try "load 'wordlist.rb'".  Possibly your default
directory is not ~/projects/ so the file cannot be found.

...Arch
Clayton Smith (Guest)
on 2005-12-29 07:23
(Received via mailing list)
Justin C. (Guest)
on 2005-12-29 07:25
David Just wrote:
> Hello,
>
> 	I'm trying to learn ruby from the Poignant guide to Ruby
> (http://poignantguide.net/ruby/chapter-4.html) and have run into a
> problem.   In chapter 4 the simple word replacement example is the
> first use of the require statement.   It does not work for me.   I'm on
> OS 10.3,  ruby 1.8.2 and my directory structure is :
>
> ~/projects/test.rb
> ~/projects/wordlist.rb
>
>
> test.rb starts with:
> require 'wordlist'
>
> and wordlist.rb just has:
> words  = {
>     'starmonkeys' => 'Phil and Pete, those prickly chancellors of the
> New Reich',
>     'catapult' => 'chucky go-go', 'firebomb' => 'Heat-Assisted Living',
>     'Nigeria' => "Ny and Jerry's Dry Cleaning (with Donuts)",
>     'Put the kabosh on' => 'Put the cable box on'
>   }
>

This has come up on the list before...
'words' needs to be a global variable or constant. It's basically a typo
in the tutorial.
Changing it to Words will get you a constant, changing it to $words will
get you a global variable.

When you require a file, the local variables in that file stay in that
scope, and are not imported into the current scope. To be able to access
them, you must make them global.


-Justin
Joel VanderWerf (Guest)
on 2005-12-31 04:14
(Received via mailing list)
Gregory B. (Guest)
on 2005-12-31 08:41
(Received via mailing list)
On 12/29/05, Justin C. <removed_email_address@domain.invalid> wrote:
> > ~/projects/wordlist.rb
> >     'Nigeria' => "Ny and Jerry's Dry Cleaning (with Donuts)",
> When you require a file, the local variables in that file stay in that
> scope, and are not imported into the current scope. To be able to access
> them, you must make them global.

actually, you could use an instance variable too @words = { .. }
works just fine.  If you don't intend to change it, use a constant.

Otherwise, you can use an instance variable which is generally better
than a global.

sandal@karookachoo:~/Shared$ cat foo.rb
@something = "hello"
sandal@karookachoo:~/Shared$ ruby -e "require 'foo'; puts @something"
hello

Hope this helps
-Greg

PS: Has anyone noticed that my code examples seem to come from a
different shell EVERY time?  I need to learn to stick to a machine for
more than a week :)
This topic is locked and can not be replied to.