加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – require和load wrt之间的差异,以“加载”和“执行”

发布时间:2020-12-17 03:29:41 所属栏目:百科 来源:网络整理
导读:以下是内核文档中的一些片段: Kernel#load Loads and executes the Ruby program in the file filename… Kernel#require Loads the given name… 我知道require和load之间存在差异,例如: require将在rb扩展上加载,而加载则不会 require将ruby文件路径存储
以下是内核文档中的一些片段:

Kernel#load

Loads and executes the Ruby program in the file filename…

Kernel#require

Loads the given name…

我知道require和load之间存在差异,例如:

> require将在rb扩展上加载,而加载则不会
> require将ruby文件路径存储在$LOADED_FEATURES aka $“中,而加载则不会
> require将在再次“加载”文件之前搜索$LOADED_FEATURES,而加载则不会

我想知道“加载”这个词和“执行”这个词之间的区别.

文档使它看起来像是两个不同的东西.对我来说,“加载”意味着“嘿,我现在知道这个文件”,而“执行”意味着“嘿,我现在知道这个文件,我也要运行所有的命令”

但我不认为这是对的.

例如,给定以下结构:

$ 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只是方法调用的语法糖.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读