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