gpt4 book ai didi

ruby-on-rails - 为什么都是autoload,load_all!并要求全部用于 active_support.rb?

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

我正在查看 active_support.rb 以尝试了解它使用的加载过程。它使用三种加载方法:load_all!autoloadrequire。为什么在同一个文件中使用三种不同的加载方式?

module ActiveSupport
def self.load_all!
[Dependencies, Deprecation, Gzip, MessageVerifier, Multibyte, SecureRandom, TimeWithZone]
end

autoload :BacktraceCleaner, 'active_support/backtrace_cleaner'
autoload :Base64, 'active_support/base64'
autoload :BasicObject, 'active_support/basic_object'
autoload :BufferedLogger, 'active_support/buffered_logger'
autoload :Cache, 'active_support/cache'
autoload :Callbacks, 'active_support/callbacks'
autoload :Deprecation, 'active_support/deprecation'
autoload :Duration, 'active_support/duration'
autoload :Gzip, 'active_support/gzip'
autoload :Inflector, 'active_support/inflector'
autoload :Memoizable, 'active_support/memoizable'
autoload :MessageEncryptor, 'active_support/message_encryptor'
autoload :MessageVerifier, 'active_support/message_verifier'
autoload :Multibyte, 'active_support/multibyte'
autoload :OptionMerger, 'active_support/option_merger'
autoload :OrderedHash, 'active_support/ordered_hash'
autoload :OrderedOptions, 'active_support/ordered_options'
autoload :Rescuable, 'active_support/rescuable'
autoload :SecureRandom, 'active_support/secure_random'
autoload :StringInquirer, 'active_support/string_inquirer'
autoload :TimeWithZone, 'active_support/time_with_zone'
autoload :TimeZone, 'active_support/values/time_zone'
autoload :XmlMini, 'active_support/xml_mini'
end

require 'active_support/vendor'
require 'active_support/core_ext'
require 'active_support/dependencies'
require 'active_support/json'

I18n.load_path << "#{File.dirname(__FILE__)}/active_support/locale/en.yml"

最佳答案

我不太清楚为什么 Rails 使用三种不同的加载方法(实际上是两种 - 见下文)。但总的来说,我知道为什么有人会这样做。

Require 表示“立即加载”。 autoload 意思是“当你需要使用它的时候加载它”。使用两者的通常原因是您有一些文件,您几乎认为这些文件将在每个程序调用中使用;和其他可选的。例如,在不使用弃用方法的 Rails 应用程序中,您永远不需要 Deprecation;那么为什么要通过加载该文件来减慢初始设置的速度呢?

在其他情况下,您可能会区分程序执行早期需要的文件和可以等待的文件。例如,在第一个请求到来之前,您不太可能需要 Gzip。因此,通过使用自动加载,您可以缩短初始设置的一些时间,但代价是第一个请求会略微变慢请求。

您可能会问,为什么不对所有内容都使用 autoload 呢?为什么要在绝对需要之前加载任何?原因之一是自动加载仅适用于常量。因此,例如,active_support/core_ext 向 Numeric 添加了一堆方法,因此您可以编写类似 3.days6.minutes 的代码,和 16.seconds.ago3.days 中没有常量,因此您无法触发该表达式的自动加载。 (并且您不能自动加载 Numeric,因为基类已经加载 - 它只是您要添加的扩展。)

最后,这个类实际上并没有使用三种加载方法;它使用两个,并提供一个(某种)。 load_all!Rails::Initializer 用来

# Preload all frameworks specified by the Configuration#frameworks.
# Used by Passenger to ensure everything's loaded before forking and
# to avoid autoload race conditions in JRuby.

我不知道细节,也不知道为什么要预加载这些特定模块(而不是其他模块)。但由于这是为了支持特定环境,您会明白为什么它可能需要与默认加载机制分开的代码。

关于ruby-on-rails - 为什么都是autoload,load_all!并要求全部用于 active_support.rb?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1012523/

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