Feature #8834

Kernel#load_relative

Added by Tsuyoshi Sawada 8 months ago. Updated 8 months ago.

[ruby-core:56866]
Status:Open
Priority:Normal
Assignee:-
Category:-
Target version:-

Description

The intended difference between Kernel#require and Kernel#load is that the former is for external libraries and the latter is for Ruby scripts internal to the project. Considering this fact, load should be more likely than require to be used in a situation where you want to call a file through a relative path. Strangely, there is Kernel#require_relative, but no Kernel#load_relative. I request Kernel#load_relative. It is even more necessary than Kernel#require_relative.

It seems to me that people are using Kernel#require_relative when they want to use a relative path, even in the context where they are supposed to use load because of the lack of Kernel#load_relative. I don't think this is a good practice. Furthermore, in cases where you have a file without a .rb or other extention that you want to call via a relative path, there is no good way to do it.

History

#1 Updated by Matthew Kerwin 8 months ago

This is an unusual description of the "intended difference" between the methods. I understood the difference between the two was: #require loads the file only once, #load does it every time. Yes, this implies that #load is for project-relative files (e.g. loading data), but it doesn't mean that #require is only for external libraries.

#2 Updated by Tsuyoshi Sawada 8 months ago

phluid61

I think what you wrote is the other way around. The only-once feature is due to the division of labor, not the other way around. See this:

http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-core/21562

#3 Updated by Matthew Kerwin 8 months ago

sawa (Tsuyoshi Sawada) wrote:

phluid61

I think what you wrote is the other way around. The only-once feature is due to the division of labor, not the other way around. See this:

http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-core/21562

I understand. I had a slightly different definition of "script" in my head. I'd forgotten that require doesn't need an extension (and can thus load any .rb, .so, etc. file), where load requires the extension.

In that vein, I personally have never seen anyone use require/_relative when they should have used load. I've never seen a project that has "scripts" that aren't library code, even if they're only project-specific libraries.

Note: I'm not arguing against #load_relative exactly, I've just never seen a need. Maybe its existence, and an education campaign, can make it useful.

#4 Updated by Anonymous 8 months ago

On 08/29/2013 07:27 PM, sawa (Tsuyoshi Sawada) wrote:

It seems to me that people are using Kernel#require_relative when
they want to use a relative path, even in the context where they are
supposed to use load because of the lack of Kernel#load_relative.

Kernel#load does try to load relatively first, doesn't it? Quoting ri:

If the filename does not resolve to an absolute path, the file is
searched for in the library directories listed in $:.

What would Kernel#load_relative do?

(I do wish the wrap param of #load could be a module to use as the
wrapper.)

#5 Updated by Nobuyoshi Nakada 8 months ago

(13/08/30 12:53), Joel VanderWerf wrote:

On 08/29/2013 07:27 PM, sawa (Tsuyoshi Sawada) wrote:

It seems to me that people are using Kernel#require_relative when
they want to use a relative path, even in the context where they are
supposed to use load because of the lack of Kernel#load_relative.

Kernel#load does try to load relatively first, doesn't it? Quoting ri:

If the filename does not resolve to an absolute path, the file is
searched for in the library directories listed in $:.

What would Kernel#load_relative do?

It's relative to the cwd, whereas require_relative does
relatively to the script path calling it.

Also available in: Atom PDF