load文件参数为false或true时,对变量,实例变量,常量的影响

# =============================
# 目标1:
# 1、load文件参数为false时,对变量,实例变量,常量的影响
# 2、load文件参数为false时,类是否被重新打开
# =============================
# 结论
# 1、变量不会被加载的文件影响,实例变量和常量会被影响。因为被加载文件中的变量会在文件加载完成后,掉出加载文件的作用域
#    而实例变量和常量不会掉出作用域
# 2、类可以被重新打开,因为被加载文件中类也没有掉出作用域(因为类也是常量)
# =============================
lambda {
  var  = 2
  @var = 2
  VAR  = 2

  class MyClass
    def my_method
      "i'm in load_2 file"
    end
  end

  puts "==========Test1:OUTPUT=========="

  load File.expand_path('load_file.rb', File.dirname(__FILE__))

  puts '==========load_2.rb======='
  puts "var :#{var }"
  puts "@var:#{@var}"
  puts "VAR :#{VAR }"
  puts "my_method:#{MyClass.new.my_method}"
  puts '==========load_2.rb======='
  puts "==========Test1:OUTPUT=========="
  # <!-- more -->
  # ==========Test1:OUTPUT==========
  # ==========load_1.rb=======
  # var :1
  # @var:1
  # VAR :1
  # my_method:i'm in load_1 file
  # ==========load_1.rb=======

  # ==========load_2.rb=======
  # var :2
  # @var:1
  # VAR :1
  # my_method:i'm in load_1 file
  # ==========load_2.rb=======
  # ==========Test1:OUTPUT==========

}

# =============================
# 目标2:
# 1、load文件参数为true时,对变量,实例变量,常量的影响
# 2、load文件参数为true时,类是否被重新打开
# =============================
# 结论
# 1、变量不会被加载的文件影响,实例变量和常量也不会被影响
# 2、类不会被影响
# 因为ruby会在load文件时为其创建匿名模块,让其文件中的实例变量、常量、类落在其自身范围内,且在load完成后,销毁这个
# 匿名模块(即加载文件中的所有内容),加入true参数的这种做法无法让加载它的文件使用其文件中代码,仅仅是起到了运行load
# 文件的代码的作用
# =============================
lambda {
  var  = 2
  @var = 2
  VAR  = 2

  class MyClass
    def my_method
      "i'm in load_2 file"
    end
  end

  puts "==========Test2:OUTPUT=========="

  load File.expand_path('load_file.rb', File.dirname(__FILE__)), true

  puts '==========load_2.rb======='
  puts "var :#{var }"
  puts "@var:#{@var}"
  puts "VAR :#{VAR }"
  puts "my_method:#{MyClass.new.my_method}"
  puts '==========load_2.rb======='
  puts "==========Test2:OUTPUT=========="

  # ==========Test2:OUTPUT==========
  # ==========load_1.rb=======
  # var :1
  # @var:1
  # VAR :1
  # my_method:i'm in load_1 file
  # ==========load_1.rb=======

  # ==========load_2.rb=======
  # var :2
  # @var:2
  # VAR :2
  # my_method:i'm in load_2 file
  # ==========load_2.rb=======
  # ==========Test2:OUTPUT==========
}.call

load_file.rb

# module Load1

var = 1
@var = 1
VAR = 1

class MyClass
  def my_method
    "i'm in load_1 file"
  end
end

puts '==========load_1.rb======='
puts "var :#{var }"
puts "@var:#{@var}"
puts "VAR :#{VAR }"
puts "my_method:#{MyClass.new.my_method}"
puts '==========load_1.rb======='
puts

# end