At Sat, 3 Aug 2002 03:14:44 +0900, <bbense+comp.lang.ruby.Aug.02.02 / telemark.stanford.edu> wrote: > >[1] and [2] have the same effect for ruby interpreter at all because > >namespace will not be nested by `require' or `load'. > > - - So require is not just a "smart" include, but something that > works at the language level[1]. Yes. require doesn't "insert" code there. require only loads a library, i.e., reads and evaluates that always in the top level context unless already loaded. A Ruby code has identical semantics regardless of require'd or directly invoked: % cat ./usee.rb def a(arg) [__FILE__, arg, self] end p [1, a(__FILE__)] % ruby ./usee.rb [1, ["./usee.rb", "./usee.rb", main]] % cat ./user.rb class C require "usee" p [2, a(__FILE__)] end require "usee" p [3, a(__FILE__)] p [4, C.public_methods.include?("a")] p [5, Object.private_methods.include?("a")] % ruby ./user.rb [1, ["./usee.rb", "./usee.rb", main]] [2, ["./usee.rb", "./user.rb", C]] [3, ["./usee.rb", "./user.rb", main]] [4, false] [5, true] # [5] because a method defined in top level is a function, i.e., a # private method of Object, that is, could not be called with explict # receiver. In other word, Ruby's require is similar to Emacs-Lisp's require, which never loads a library twice and doesn't change the meaning of a library to be loaded. -- Gotoken