gpt4 book ai didi

ruby - 在ruby中,什么用法会触发Kernel#autoload?

转载 作者:数据小太阳 更新时间:2023-10-29 08:27:13 27 4
gpt4 key购买 nike

Kernel#autoload记录如下:

Registers filename to be loaded (using Kernel::require) the first time that module (which may be a String or a symbol) is accessed.

“访问”的定义是什么?

我惊讶地发现“空”类定义会触发自动加载。

# a.rb
class A
def foo() end
end

# irb -I .
autoload :A, 'a.rb'
#=> nil
class A; end # supposedly "empty" class ..
#=> nil
A.instance_methods.include?(:foo) # .. is not "empty"!
#=> true

因为我使用了 class 关键字,所以我希望上面的代码定义一个“空”类 A。具体来说,我不希望 A 的实例响应 foo。我没想到会自动加载 a.rb

那么,触发自动加载的“访问”的准确定义是什么?

最佳答案

一般来说,在 Ruby 中,类定义代码或任何其他可执行代码之间没有区别。

这意味着,一旦遇到语句,就会调用以下语句:

5.times { puts "Hello" }

以同样的方式,class的代码一定义就执行:

class C
puts "Hello"
end
=> "Hello"

有人可能奇怪里面被调用的实例方法、类方法没有执行。原因是这些方法持有绑定(bind),因此在类的实例(对象)上被调用(另外,这完全是另一回事)。

这定义了您问题中的访问class A定义后立即访问。正如 Arup 在他的回答中所说,autoload执行延迟加载,并且 class/module仅在它们被访问 时加载。在 Ruby 中打开的类会触发 class A 的自动加载在 a.rb .

希望这有帮助。:)

关于ruby - 在ruby中,什么用法会触发Kernel#autoload?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24088234/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com