"load"ing a file and keeping the current scope?

Hi -

For a variety of reasons I have the following situation:

---- file_a.rb --------------------------------------
class A
   ... magic loading goes here...
end

···

--------------------------------------------------

---- file_b.rb --------------------------------------
class B
   ... magic loading goes here...
end
--------------------------------------------------

---- magic_file.rb -----------------------------
... does some stuff... ----------------------------------------------

How can I include the contents of magic_file.rb into both a and b "as is". I've tried load() and it changes the scope so that magic_file.rb doesn't realize it's in A or B.

I guess I'm looking for the PHP include() equivalent.

I realize this is a weird question and I realize in most situations this is *not* the way to do it, but I don't have a choice... so please no "do it this other way" solutions :slight_smile:

Thanks!

-philip

class A
    eval(File.read("magic_file.rb"))
end

···

On May 8, 2006, at 4:05 PM, Philip Hallstrom wrote:

Hi -

For a variety of reasons I have the following situation:

---- file_a.rb --------------------------------------
class A
  ... magic loading goes here...
end
--------------------------------------------------

---- file_b.rb --------------------------------------
class B
  ... magic loading goes here...
end
--------------------------------------------------

---- magic_file.rb -----------------------------
... does some stuff... ----------------------------------------------

How can I include the contents of magic_file.rb into both a and b "as is". I've tried load() and it changes the scope so that magic_file.rb doesn't realize it's in A or B.

I guess I'm looking for the PHP include() equivalent.

I realize this is a weird question and I realize in most situations this is *not* the way to do it, but I don't have a choice... so please no "do it this other way" solutions :slight_smile:

Thanks!

-philip

I believe the following is your only choice:

  eval File.read("magic_file.rb")

···

On 5/8/06, Philip Hallstrom <ruby@philip.pjkh.com> wrote:

How can I include the contents of magic_file.rb into both a and b "as is".
I've tried load() and it changes the scope so that magic_file.rb doesn't
realize it's in A or B.

I guess I'm looking for the PHP include() equivalent.

I realize this is a weird question and I realize in most situations this
is *not* the way to do it, but I don't have a choice... so please no "do
it this other way" solutions :slight_smile:

--
Christoffer Sawicki

I realize this is against your "no other solutions" rule, but why won't

% cat magic_file.rb
module Stuff
   ...
end

% cat a.rb
class A
   require 'magic_file'
   include Stuff
end

work?

···

On May 8, 2006, at 4:08 PM, Logan Capaldo wrote:

On May 8, 2006, at 4:05 PM, Philip Hallstrom wrote:

Hi -

For a variety of reasons I have the following situation:

---- file_a.rb --------------------------------------
class A
  ... magic loading goes here...
end
--------------------------------------------------

---- file_b.rb --------------------------------------
class B
  ... magic loading goes here...
end
--------------------------------------------------

---- magic_file.rb -----------------------------
... does some stuff... ----------------------------------------------

How can I include the contents of magic_file.rb into both a and b "as is". I've tried load() and it changes the scope so that magic_file.rb doesn't realize it's in A or B.

I guess I'm looking for the PHP include() equivalent.

I realize this is a weird question and I realize in most situations this is *not* the way to do it, but I don't have a choice... so please no "do it this other way" solutions :slight_smile:

Thanks!

-philip

class A
   eval(File.read("magic_file.rb"))
end

> Hi -
>
> For a variety of reasons I have the following situation:
>
> ---- file_a.rb --------------------------------------
> class A
> ... magic loading goes here...
> end
> --------------------------------------------------
>
> ---- file_b.rb --------------------------------------
> class B
> ... magic loading goes here...
> end
> --------------------------------------------------
>
> ---- magic_file.rb -----------------------------
> ... does some stuff... ----------------------------------------------
>
> How can I include the contents of magic_file.rb into both a and b
> "as is".
> ...
>
> -philip
>

class A
    eval(File.read("magic_file.rb"))
end

Interesting solution. What about its effectivenes? And in general,
effectivenes of require'ing something vs. eval'ing it?

Victor

···

From: Logan Capaldo [mailto:logancapaldo@gmail.com]

On May 8, 2006, at 4:05 PM, Philip Hallstrom wrote:

Well require-ing only parses the file once. Other than that, this takes more memory (since it puts the entire file inside a string) but other than that I'm pretty sure the difference is effectively zero. The 'ideal' solution to this problem would be if load took an optional binding argument
e.g.:

class A
   load("magic_file.rb", false, binding)
end

···

On May 8, 2006, at 4:16 PM, Victor Shepelev wrote:

From: Logan Capaldo [mailto:logancapaldo@gmail.com]

On May 8, 2006, at 4:05 PM, Philip Hallstrom wrote:

Hi -

For a variety of reasons I have the following situation:

---- file_a.rb --------------------------------------
class A
  ... magic loading goes here...
end
--------------------------------------------------

---- file_b.rb --------------------------------------
class B
  ... magic loading goes here...
end
--------------------------------------------------

---- magic_file.rb -----------------------------
... does some stuff... ----------------------------------------------

How can I include the contents of magic_file.rb into both a and b
"as is".
...

-philip

class A
    eval(File.read("magic_file.rb"))
end

Interesting solution. What about its effectivenes? And in general,
effectivenes of require'ing something vs. eval'ing it?

Victor

For a variety of reasons I have the following situation:

---- file_a.rb --------------------------------------
class A
  ... magic loading goes here...
end
--------------------------------------------------

---- file_b.rb --------------------------------------
class B
  ... magic loading goes here...
end
--------------------------------------------------

---- magic_file.rb -----------------------------
... does some stuff... ----------------------------------------------

How can I include the contents of magic_file.rb into both a and b "as is". I've tried load() and it changes the scope so that magic_file.rb doesn't realize it's in A or B.

I guess I'm looking for the PHP include() equivalent.

I realize this is a weird question and I realize in most situations this is *not* the way to do it, but I don't have a choice... so please no "do it this other way" solutions :slight_smile:

Thanks!

-philip

class A
  eval(File.read("magic_file.rb"))
end

That worked. Thanks!

I realize this is against your "no other solutions" rule, but why won't

% cat magic_file.rb
module Stuff
...
end

% cat a.rb
class A
require 'magic_file'
include Stuff
end

work?

Not sure... (i'm fairly new to ruby) but I tried it and it doesn't. Here's specific details on what I'm doing (rails web services):

-philip

% cat magic_stuff.rb
module FindNewerThan
   def self.included(other)
     other.class_eval do
       api_method :find_newer_than,
      :expects => [{:created_at => :datetime}],
      :returns => [[Class.const_get(self.name.to_s.gsub(/Api$/, ''))]]
     end
   end
end

% cat a.rb
require 'magic_stuff.rb'
class A
   include FindNewerThan
end

class B
   include FindNewerThan
end

etc...

···

On May 8, 2006, at 5:23 PM, Philip Hallstrom wrote:

For a variety of reasons I have the following situation:
---- file_a.rb --------------------------------------
class A
  ... magic loading goes here...
end
--------------------------------------------------
---- file_b.rb --------------------------------------
class B
  ... magic loading goes here...
end
--------------------------------------------------
---- magic_file.rb -----------------------------
... does some stuff... ----------------------------------------------
How can I include the contents of magic_file.rb into both a and b "as is". I've tried load() and it changes the scope so that magic_file.rb doesn't realize it's in A or B.
I guess I'm looking for the PHP include() equivalent.
I realize this is a weird question and I realize in most situations this is *not* the way to do it, but I don't have a choice... so please no "do it this other way" solutions :slight_smile:
Thanks!
-philip

class A
  eval(File.read("magic_file.rb"))
end

That worked. Thanks!

I realize this is against your "no other solutions" rule, but why won't

% cat magic_file.rb
module Stuff
...
end

% cat a.rb
class A
require 'magic_file'
include Stuff
end

work?

Not sure... (i'm fairly new to ruby) but I tried it and it doesn't. Here's specific details on what I'm doing (rails web services):

Including common code among multiple web services issue? - Rails - Ruby-Forum

-philip