Trans
10/24/2008 6:09:00 PM
On Oct 24, 1:55=A0pm, Richard Crowley <r...@rcrowley.org> wrote:
> I have a bit of code here that I'd love to make better:
>
> class Foo
> =A0 =A0 =A0def initialize(path)
> =A0 =A0 =A0 =A0 =A0self.instance_eval(File.read(path))
> =A0 =A0 =A0end
> end
>
> I don't want to continue down the path of reading an entire file into a
> string and then eval'ing that string just to get the contents of the
> file executed as if it were the body of a method in a class. =A0The file
> passed to the constructor above might contain something like:
>
> @foo =3D 'This will become an instance variable when you do Foo.new(path)=
'
>
> I've tried all manner of hacks to make Kernel#load and friends execute
> code as if it were in the calling scope. =A0In every case I've seen the
> loaded file leave no lasting effect on the instance variables of the
> calling method. =A0My goal is to be able to do exactly this:
>
> class Foo
> =A0 =A0 =A0def initialize(path)
> =A0 =A0 =A0 =A0 =A0load_in_scope path
> =A0 =A0 =A0end
> end
> f =3D Foo.new('load_me.rb')
> f.instance_variables # =3D> ['@foo']
>
> My assumption here is that reading a file into a string and eval'ing it
> is very slow and is bad form. =A0Am I right?
>
> Is this possible without reading the file into a string? =A0Is this
> possible without hacking the C code? =A0Should I go bother ruby-core?
Ultimately, it's the same thing, whether you do it in Ruby or C. I
doubt it would be that much faster in C than it is in pure Ruby b/c it
is dynamic --the path can change. However, you may actually intend:
class Foo
def initialize(path)
eval(File.read(path), __FILE__, __LINE__)
end
end
T.