Forum: Ruby Passing variables to a required file

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.
5a9ba83f28f840c9c2ef79557d3b77b1?d=identicon&s=25 Greg __ (mtnbiker)
on 2007-07-30 22:19
I want to pass about 10 variables to a "require"d file. My understanding
is that I need to use global variables. Is this correct?

I'm reluctant to change all the variables to global for fear of messing
up the methods in the script. I can of course define new global
variables equal to the local variable. Seems inelegant.

I guess my best option is to rework the require'd file as a method, but
my script is getting long and keeping the file separate makes sense,
particularly since it is creating the GUI, so is different from the
script function if I understand the MVC philosophy.

Is there a better way? FWIW I'm "require'ing a modified example.rb file
that is included in the Pashua app for creating a simple GUI for OS X.
<http://www.bluem.net/downloads/pashua_en/>

Thanks for info

PS The example file as a

Config = <<EOS

<bunch of code>
EOS

I can't find EOS in Ruby on Rails or PickAxe, so maybe I'm missing
something in how it's used.
Ad7805c9fcc1f13efc6ed11251a6c4d2?d=identicon&s=25 Alex Young (regularfry)
on 2007-07-30 22:52
(Received via mailing list)
12 34 wrote:
> script function if I understand the MVC philosophy.
>
> Is there a better way? FWIW I'm "require'ing a modified example.rb file
> that is included in the Pashua app for creating a simple GUI for OS X.
> <http://www.bluem.net/downloads/pashua_en/>
Change your code.  It'll be easier to do it now than to unpick
everything later.

What you want (probably) is to wrap your code in the require'd file into
a class that you can instantiate with the relevant parameters in your
main script.

> something in how it's used.
It's a heredoc marker.  It's just another way of creating a multiline
string.  The critical bit is the "<<EOS" start marker - after "<<" you
can put any identifier, and a string will be created from the content
between that line and the first occurrence of that marker on its own
later in the file.

HTH
88de1beaaacae26b839f2e6aebf857b6?d=identicon&s=25 Thomas Wieczorek (Guest)
on 2007-07-30 23:07
(Received via mailing list)
2007/7/30, 12 34 <rubyforum@web.knobby.ws>:
> I want to pass about 10 variables to a "require"d file. My understanding
> is that I need to use global variables. Is this correct?
>

I'd do the same as Alex and put the Config constant in a class(or any
other way to pass the parameters, I am quite new to Ruby and don't
know of something better yet)

>
Check Chapter 5 "Strings" in the Pickaxe, it is called *here document*
there.
5a9ba83f28f840c9c2ef79557d3b77b1?d=identicon&s=25 Greg __ (mtnbiker)
on 2007-07-30 23:26
Alex Young wrote:
> 12 34 wrote:
>>
>> Is there a better way? FWIW I'm "require'ing a modified example.rb file
>> that is included in the Pashua app for creating a simple GUI for OS X.
>> <http://www.bluem.net/downloads/pashua_en/>
> Change your code.  It'll be easier to do it now than to unpick
> everything later.
>
> What you want (probably) is to wrap your code in the require'd file into
> a class that you can instantiate with the relevant parameters in your
> main script.
>

OK. For now that's the best solution for me, but later I will look at
putting in a separate file.

>> something in how it's used.
> It's a heredoc marker.  It's just another way of creating a multiline
> string.  The critical bit is the "<<EOS" start marker - after "<<" you
> can put any identifier, and a string will be created from the content
> between that line and the first occurrence of that marker on its own
> later in the file.

Thank you Alex and  Thomas, now I see that a long string is being
prepared to send to the Perl script or something like that. And I'm
trying to get my Ruby variable in that string. They syntax in the string
didn't quite look like Ruby, missing quotes and things.

So EOS presumably means something like End of String and is commonly
used but has no special meaning to Ruby. Confusing also to me that the
word in front of <<EOS was "Config" which could be just a descriptive
name or word with a special meaning.
>
> HTH

I think this will get me over the hump of using a file to prepare a
string to send to some kind of Perl script (it's really an OS X app) to
make a GUI. At the moment I was trying to recover the return from
calling the "require." That problem will probably go away if I make it
class or method.
Ad7805c9fcc1f13efc6ed11251a6c4d2?d=identicon&s=25 Alex Young (regularfry)
on 2007-07-30 23:44
(Received via mailing list)
12 34 wrote:
>> main script.
>>
>
> OK. For now that's the best solution for me, but later I will look at
> putting in a separate file.
Well, the class definition can still be in the external file - that's
actually what I meant.  You can do something like this:

main.rb:

require 'ui_code'

UICode.new(all, your, parameters).run

ui_code.rb:

class UICode
   def initialize(use, meaningful, parameter, names)
     @use = use
     @meaningful = meaningful
     # etc...
   end

   def run
     #your current code goes here, referring to instance variables
rather
     # than globals
   end
end

That's a fairly typical arrangement, in fact.

> didn't quite look like Ruby, missing quotes and things.
>
> So EOS presumably means something like End of String and is commonly
> used but has no special meaning to Ruby. Confusing also to me that the
> word in front of <<EOS was "Config" which could be just a descriptive
> name or word with a special meaning.
Nope, it's just a variable name.  Except that here it's a little weird -
because it's capitalised, it's a constant.  Not sure if that's relevant,
but don't worry about the specific name "Config" being anything special.
5a9ba83f28f840c9c2ef79557d3b77b1?d=identicon&s=25 Greg __ (mtnbiker)
on 2007-07-31 01:14
Alex Young wrote:
> 12 34 wrote:
>>> main script.
>>>
>>
>> OK. For now that's the best solution for me, but later I will look at
>> putting in a separate file.
> Well, the class definition can still be in the external file - that's
> actually what I meant.  You can do something like this:
>
> main.rb:
>
> require 'ui_code'
>
> UICode.new(all, your, parameters).run
>
> ui_code.rb:
>
> class UICode
>    def initialize(use, meaningful, parameter, names)
>      @use = use
>      @meaningful = meaningful
>      # etc...
>    end
>
>    def run
>      #your current code goes here, referring to instance variables
> rather
>      # than globals
>    end
> end
>
> That's a fairly typical arrangement, in fact.

Thank you for clarifying this. Since it's a one shot thing I've been
using defs and not classes. But maybe that makes a difference. I need to
reread my books to get clearer on this.
>
>> didn't quite look like Ruby, missing quotes and things.
>>
>> So EOS presumably means something like End of String and is commonly
>> used but has no special meaning to Ruby. Confusing also to me that the
>> word in front of <<EOS was "Config" which could be just a descriptive
>> name or word with a special meaning.
> Nope, it's just a variable name.  Except that here it's a little weird -
> because it's capitalised, it's a constant.  Not sure if that's relevant,
> but don't worry about the specific name "Config" being anything special.

Turns out to matter a lot. Broken with EOS, works with eos. Although did
worked when in a separate file. I had moved it into my main script. I
came back to the thread to repost about an error I was getting at the
<<EOS. So that's fixed.

Thanks for your comments.
5a9ba83f28f840c9c2ef79557d3b77b1?d=identicon&s=25 Greg __ (mtnbiker)
on 2007-07-31 01:29
12 34 wrote:
>>> So EOS presumably means something like End of String and is commonly
>>> used but has no special meaning to Ruby. Confusing also to me that the
>>> word in front of <<EOS was "Config" which could be just a descriptive
>>> name or word with a special meaning.
>> Nope, it's just a variable name.  Except that here it's a little weird -
>> because it's capitalised, it's a constant.  Not sure if that's relevant,
>> but don't worry about the specific name "Config" being anything special.
>
> Turns out to matter a lot. Broken with EOS, works with eos. Although did
> worked when in a separate file. I had moved it into my main script. I
> came back to the thread to repost about an error I was getting at the
> <<EOS. So that's fixed.
>
Sorry, my response above is incorrect.  I made the change from EOS to
eos in the stand alone file and ran that file in TextMate. When I use it
as a require or integrated in my main script I get the following error
(changed from eos to end_of_string).

 dynamic constant assignment
Config = <<end_of_string

Maybe I'd better go back to the separate file and start over again.
E0d864d9677f3c1482a20152b7cac0e2?d=identicon&s=25 Robert Klemme (Guest)
on 2007-07-31 10:32
(Received via mailing list)
2007/7/30, 12 34 <rubyforum@web.knobby.ws>:
> script function if I understand the MVC philosophy.
>
> <bunch of code>
> EOS
>
> I can't find EOS in Ruby on Rails or PickAxe, so maybe I'm missing
> something in how it's used.

I'd suggest to refactor your code so you have multiple classes and can
instantiate them with appropriate parameters.  Storing code in a long
string is a bad option if the code is known at compile time which
seems to be the case here.

Kind regards

robert
5a9ba83f28f840c9c2ef79557d3b77b1?d=identicon&s=25 Greg __ (mtnbiker)
on 2007-07-31 21:55
Robert Klemme wrote:
> 2007/7/30, 12 34 <why does my email appear here ARGH>:
>> EOS
>>
> I'd suggest to refactor your code so you have multiple classes and can
> instantiate them with appropriate parameters.  Storing code in a long
> string is a bad option if the code is known at compile time which
> seems to be the case here.
>
> Kind regards
>
> robert

This is getting over my head, but the code that is a string will be
changed on running the script. I'll be putting in variable via
#{variable}. As I understand it this string is sent to a Mac application
that puts up a GUI window and then returns the options (text, filenames,
etc) entered in a hash. I'm using the initial #{variable} to put in
default selections in the GUI. They could be written in the original
script, but I'd rather keep them in the main script. And I envision
transitioning to other GUI's if this one doesn't work out or I learn
Rails or who know what?

If I should still do as you say, let me know and I'll study some more.
As I may have said earlier, I've only used defs (and I use them
liberally for what I think is the usual reason to keep the code easier
to read). Although I've worked through some tutorials and Ruby on Rails
stuff, I haven't quite got my head around classes and instantiation. My
script / app will be run each time I download photos and set them up for
transfer to my photo program (Aperture). I'm not saving any of the
information except defaults which at the moment I'm hard wiring into the
code, but may set up a YAML to save the last selections which then
become the defaults.  I've also set myself the task of (re)reading
PickAxe on my vacation which starts next week.

Thank you for your comments.
This topic is locked and can not be replied to.