ruby – require和load wrt之间的差异,以“加载”和“执行”
以下是内核文档中的一些片段:
Kernel#load
Kernel#require
我知道require和load之间存在差异,例如: > require将在rb扩展上加载,而加载则不会 我想知道“加载”这个词和“执行”这个词之间的区别. 文档使它看起来像是两个不同的东西.对我来说,“加载”意味着“嘿,我现在知道这个文件”,而“执行”意味着“嘿,我现在知道这个文件,我也要运行所有的命令” 但我不认为这是对的. 例如,给定以下结构: $ tree . ├── bar.rb ├── baz.rb └── foo.rb 0 directories,3 files 与foo.rb: $LOAD_PATH << __dir__ require 'bar' load 'baz.rb' bar.rb: puts "Inside of bar..." baz.rb: puts "Inside of baz..." 当我运行foo.rb时,我希望“在baz …内部”打印而不是“在栏内…”因为加载“加载并执行”而只需要“加载”.但实际发生的事情似乎都是“执行”: $ ruby foo.rb Inside of bar... Inside of baz... 那么“加载”和“执行”ruby文件之间有区别吗? 解决方法
始终执行该文件.
在Ruby中,没有加载文件而不执行文件.一切都是Ruby中的声明,必须执行.即使是class和def也只是陈述. 为了说明这一点,这是一个愚蠢的例子 class Mystery < [Array,Object,String,Fixnum].sample ... end 这将创建一个具有随机超类的类.只是为了说明Ruby没有声明,只有可执行语句. 所以没有不执行Ruby文件的事情. load和require之间的区别如您所述,后者跟踪所有加载的文件以避免重新加载它们. PS,另一个例子 ruby --dump insns -e 'def example; end' == disasm: <RubyVM::InstructionSequence:<main>@-e>====================== 0000 trace 1 ( 1) 0002 putspecialobject 1 0004 putspecialobject 2 0006 putobject :example 0008 putiseq example 0010 opt_send_without_block <callinfo!mid:core#define_method,argc:3,ARGS_SIMPLE> 0012 leave == disasm: <RubyVM::InstructionSequence:example@-e>===================== 0000 trace 8 ( 1) 0002 putnil 0003 trace 16 ( 1) 0005 leave 你可以看到def例子; end是一个语句,内部调用define_method方法.所以def只是方法调用的语法糖. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |