Hi,

Sorry to "dig up" this thread, but I changed my mind about it, and
intend to report this as a bug.

I think, however, it is better to speak here first.

On 22 January 2010 14:59, Yusuke ENDOH <mame / tsg.ne.jp> wrote:
> Roger Pack wrote:
>>
>> Currently with 1.9.x you cannot "re-require" a file, even if you pass
>> it a different relative path.
>>
>> However, I did notice that you can "re-require" $0
>> ex:
>>
>> bad.rb:
>>  require $0
>>
>> Is this a bug, then?
>> -r
>>
> [...]
> ... Ah, I get Roger's point now.
>
>
> bad.rb:
>   
>   
>
> $ ruby19 ./bad.rb
> :foo
> :foo
>
> Yusuke ENDOH <mame / tsg.ne.jp>

So the problem is the "main" script is not "loaded" in $", and can
then cause large annoyance.

Of course, no one would probably ever "require {$0,__FILE__,name_of_this_file}"

But, for flexibility and other reasons, many people use something like:
Dir[File.join(File.dirname(__FILE__), "*.rb")].each { |f| require f }
or maybe
Dir[File.expand_path("../*.rb", __FILE__)].each { |f| require f }

This is clearly cleaner than sometimes dozens of requireS.

When you think it could require itself, you may think to add this:
Dir[File.expand_path("../*.rb", __FILE__)].each { |f| require f unless
f == __FILE__ }

But, if another script require this one, __FILE__ may not be absolute,
which obligate you to use:
Dir[File.expand_path("../*.rb", __FILE__)].each { |f| require f unless
File.identical?(f, __FILE__) }

Now, I think I all got you upset, because the wrapping becomes bad,
and this line is way too long for what it does.
(and in Java this is 0 characters, here in Ruby it is about 100 !)

Well, my script hierarchy is probably not the best,
and anyone could do better if he creates some directory and then use
Dir::[] which doe not include the file it is written in.

But, I believe using some scripts in the same directory is the first
and natural structure
 when you just want to separate a little your code.

I also think we could do so much better with require_relative (though
it would not be compatible with 1.8).
Something in the lines of:
  require_relative '*.rb'
  require_relative 'dir/*.rb'
  require_relative '**/*.rb'

This would be *really* nice, at least to me.

( The only disadvantage I see of loading 'dynamically' scripts is you
do not control the load order. But this is often not a problem, as all
the code in the methods are evaluated only when everything is loaded.
Only constants and code outside methods can cause some problems )

Do you share my thoughts?

P.S.: I just got the problem now, so please excuse me if I am speaking too hard.

Benoit Daloze