require not working correctly?

Discussion in 'Ruby' started by Adlai, May 20, 2009.

  1. Adlai

    Adlai Guest

    I'm just starting out in Ruby, and I used the one-click installer. The
    version on my computer seems to be Ruby 1.8.6-27.

    I'm working through some of the examples in Why's Poignant Guide, and
    things seem to have broken down here:

    File wordlist.rb contains:
    puts 'Wordlist got required'
    code_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'
    }

    File script.rb contains:
    require 'wordlist'
    # Get evil idea and swap in code words
    puts "Enter your new idea: "
    idea = gets
    code_words.each do |real, code|
    idea.gsub!(real, code)
    end
    # Save the jibberish to a new file
    puts "File encoded. Please enter a name for this idea: "
    idea_name = gets.strip
    File::eek:pen("idea-" + idea_name + ".txt", "w") do |f|
    f << idea
    end

    This is basically copied out of the Poignant Guide, with the addition
    of the puts method at the start of wordlist.rb.

    Both are in the same directory. I navigate to that directory in cmd,
    and then type ruby script.rb

    It prints Wordlist got required, then prompts for an evil idea, and
    after I hit enter, gives the following error:
    script.rb:5: undefined local variable or method `code_words' for
    main:Object (NameError)

    What am I doing wrong?

    Thanks,

    - Adlai
     
    Adlai, May 20, 2009
    #1
    1. Advertising

  2. Adlai

    Roger Pack Guest

    > File script.rb contains:
    > require 'wordlist'



    > It prints Wordlist got required, then prompts for an evil idea, and
    > after I hit enter, gives the following error:
    > script.rb:5: undefined local variable or method `code_words' for
    > main:Object (NameError)
    >
    > What am I doing wrong?


    The scripts operate each in its own "scope" so setting a variable in one
    doesn't set it in the other. Kind of confusing at first, but at least
    you don't have to worry about leaked variables from one script to the
    next.
    To avoid it save it to a global like
    $code_words
    or put it all in one .rb file.
    GL!
    -=r
    --
    Posted via http://www.ruby-forum.com/.
     
    Roger Pack, May 20, 2009
    #2
    1. Advertising

  3. Adlai

    Adlai Guest

    On May 20, 11:44 pm, Roger Pack <> wrote:
    > > File script.rb contains:
    > > require 'wordlist'
    > > It prints Wordlist got required, then prompts for an evil idea, and
    > > after I hit enter, gives the following error:
    > > script.rb:5: undefined local variable or method `code_words' for
    > > main:Object (NameError)

    >
    > > What am I doing wrong?

    >
    > The scripts operate each in its own "scope" so setting a variable in one
    > doesn't set it in the other.  Kind of confusing at first, but at least
    > you don't have to worry about leaked variables from one script to the
    > next.
    > To avoid it save it to a global like
    > $code_words


    I figured out this trick myself, but globals could cause problems in
    larger projects with name collisions...

    > or put it all in one .rb file.
    > GL!
    > -=r
    > --
    > Posted viahttp://www.ruby-forum.com/.


    Thanks for your help. Just wanted to make sure that I wasn't making
    some newbie mistake.

    - Adlai
     
    Adlai, May 20, 2009
    #3
  4. Adlai

    Roger Pack Guest

    > I figured out this trick myself, but globals could cause problems in
    > larger projects with name collisions...


    The only way to share things across scopes is constants or globals--that
    I know of :)


    So you could rename it CODE_WORDS and that would work.
    -=r
    --
    Posted via http://www.ruby-forum.com/.
     
    Roger Pack, May 20, 2009
    #4
  5. Roger Pack wrote:
    >> I figured out this trick myself, but globals could cause problems in
    >> larger projects with name collisions...

    >
    > The only way to share things across scopes is constants or globals--that
    > I know of :)


    You can also write your own #load method, and use the return value to
    access things defined in the loaded file. It's actually quite easy to do
    this. Here's the approach I use:

    http://redshift.sourceforge.net/script/

    --
    vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407
     
    Joel VanderWerf, May 20, 2009
    #5
  6. Adlai

    Adlai Guest

    On May 21, 12:39 am, Joel VanderWerf <> wrote:
    > Roger Pack wrote:
    > >> I figured out this trick myself, but globals could cause problems in
    > >> larger projects with name collisions...

    >
    > > The only way to share things across scopes is constants or globals--that
    > > I know of :)

    >
    > You can also write your own #load method, and use the return value to
    > access things defined in the loaded file. It's actually quite easy to do
    > this. Here's the approach I use:
    >
    > http://redshift.sourceforge.net/script/
    >
    > --
    >        vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407


    Thank you Joel. I'll let you know how I like your Script thingy after
    I play around with it later today.

    - Adlai
     
    Adlai, May 21, 2009
    #6
  7. Adlai

    Marc Heiler Guest

    Does this work with local variables too?

    For example, lets say I have a file called:

    foobar.rb

    Inside it we could have a class

    class Foo
    def test
    puts 'hi from class Foo'
    end
    end

    foo_object = Foo.new


    Now, I would like to use this variable
    foo_object
    in another ruby file, or context.

    But as far as I know without eval this was not possible.

    Is this somehow possible with 'script'? (My brain is a bit confused
    right now.)
    --
    Posted via http://www.ruby-forum.com/.
     
    Marc Heiler, May 23, 2009
    #7
  8. Marc Heiler wrote:
    > Does this work with local variables too?
    >
    > For example, lets say I have a file called:
    >
    > foobar.rb
    >
    > Inside it we could have a class
    >
    > class Foo
    > def test
    > puts 'hi from class Foo'
    > end
    > end
    >
    > foo_object = Foo.new
    >
    >
    > Now, I would like to use this variable
    > foo_object
    > in another ruby file, or context.
    >
    > But as far as I know without eval this was not possible.
    >
    > Is this somehow possible with 'script'? (My brain is a bit confused
    > right now.)


    With 'script', you can only export constants and methods. So you could
    do this:

    FOO_OBJECT = Foo.new

    and then your main file can do this:

    my_script = Script.load("foobar.rb")
    p my_script::FOO_OBJECT

    Even though you are defining a constant, it is accessible only via the
    object assigned to my_script (the object is in fact a module), so you
    don't have to worry about namespace pollution.

    HTH...

    --
    vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407
     
    Joel VanderWerf, May 23, 2009
    #8
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. =?Utf-8?B?SUdvdFlvdXJEb3ROZXQ=?=

    sort not working correctly

    =?Utf-8?B?SUdvdFlvdXJEb3ROZXQ=?=, Aug 18, 2004, in forum: ASP .Net
    Replies:
    4
    Views:
    521
    =?Utf-8?B?SUdvdFlvdXJEb3ROZXQ=?=
    Aug 18, 2004
  2. Hermit Dave

    Re: dropdownlist box not working correctly

    Hermit Dave, Sep 2, 2004, in forum: ASP .Net
    Replies:
    0
    Views:
    420
    Hermit Dave
    Sep 2, 2004
  3. Stuart Palmer

    History not working correctly

    Stuart Palmer, Jun 2, 2004, in forum: HTML
    Replies:
    0
    Views:
    386
    Stuart Palmer
    Jun 2, 2004
  4. rosemm
    Replies:
    2
    Views:
    806
    Martin Honnen
    Apr 5, 2005
  5. David Lee
    Replies:
    2
    Views:
    227
    David Lee
    Mar 27, 2009
Loading...

Share This Page