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


#1

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


#2

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

---- file_b.rb --------------------------------------
magic_file.rb doesn’t realize it’s in A or B.

class A
eval(File.read(“magic_file.rb”))
end


#3

On 5/8/06, Philip H. removed_email_address@domain.invalid 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:

I believe the following is your only choice:

eval File.read(“magic_file.rb”)


#4

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

end

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?


#5

From: Logan C. [mailto:removed_email_address@domain.invalid]


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


#6

… magic loading goes here…
I guess I’m looking for the PHP include() equivalent.

class A
eval(File.read(“magic_file.rb”))
end

That worked. Thanks!

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):

http://www.ruby-forum.com/topic/65015#new

-philip


#7

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


Thanks!
% cat magic_file.rb
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):

http://www.ruby-forum.com/topic/65015#new

-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…


#8

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

class A
---- magic_file.rb -----------------------------
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

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