- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我爱the autoload functionality of Ruby ;然而,它是 going away in future versions of Ruby因为它从来都不是线程安全的。
所以现在我想假装它已经消失并在没有它的情况下编写我的代码,方法是自己实现延迟加载机制。我想以最简单的方式实现它(我现在不关心线程安全)。 Ruby 应该允许我们这样做。
让我们从扩充一个类开始const_missing
:
class Dummy
def self.const_missing(const)
puts "const_missing(#{const.inspect})"
super(const)
end
end
当我们尝试引用“Dummy”下缺少的常量时,Ruby 将调用此特殊方法,例如,如果我们尝试引用“Dummy::Hello”,它将调用 const_missing
符号:你好
。这正是我们所需要的,所以让我们更进一步:
class Dummy
def self.const_missing(const)
if :OAuth == const
require 'dummy/oauth'
const_get(const) # warning: possible endless loop!
else
super(const)
end
end
end
现在如果我们引用“Dummy::OAuth”,它将需要“dummy/oauth.rb”文件,该文件应该定义“Dummy::OAuth”常量。当我们调用 const_get
时可能会出现无限循环(因为它可以在内部调用 const_missing
),但防止这种情况超出了这个问题的范围。
最大的问题是,如果在顶级命名空间中存在名为“OAuth”的模块,整个解决方案就会崩溃。引用“Dummy::OAuth”将跳过其 const_missing
并从顶层返回“OAuth”。大多数 Ruby 实现也会对此发出警告:
warning: toplevel constant OAuth referenced by Dummy::OAuth
This was reported as a problem way back in 2003但我找不到证据表明 Ruby 核心团队曾经关注过这个问题。今天,大多数流行的 Ruby 实现都具有相同的行为。
问题是 const_missing
被悄悄跳过,取而代之的是顶级命名空间中的常量。如果使用 Ruby 的 autoload
功能声明“Dummy::OAuth”,则不会发生这种情况。有什么想法可以解决这个问题吗?
最佳答案
这是前段时间在 Rails 票证中提出的,当我调查它时,似乎没有办法绕过它。问题在于 Ruby 会在调用 const_missing
之前搜索祖先,并且由于所有类都以 Object
作为祖先,因此总会找到任何顶级常量。如果您可以将自己限制为仅使用模块进行命名空间,那么它将起作用,因为它们没有 Object
作为祖先,例如:
>> class A; end
>> class B; end
>> B::A
(irb):3: warning: toplevel constant A referenced by B::A
>> B.ancestors
=> [B, Object, Kernel, BasicObject]
>> module C; end
>> module D; end
>> D::C
NameError: uninitialized constant D::C
>> D.ancestors
=> [D]
关于ruby - 在没有 `autoload` 的情况下在 Ruby 中自动加载类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9053720/
Kernel#autoload 和 Module#autoload 有什么区别?每个使用的上下文是什么? 最佳答案 正如标准文档中这些方法的源代码所示, Kernel#autoload 电话 Modu
我对 Laravel 4 和 Composer 还是很陌生。当我做 Laravel 4 教程时,我无法理解这两个命令之间的区别; php artisan dump-autoload 和 compose
search() 上的倒数第二项path 是(总是?)一个名为 Autoloads 的环境.关于这个话题,我能找到的只是 R language definition 第 26 页上的一句话。 (PDF
package My::Win32::Console; use warnings; use strict; use parent qw( Win32::Console ); sub new {
我的 MVC 结构如下: - web -- Classes --- Loader.php -- Core --- Controller.php --- Model.ph
本文实例分析了Yii2中YiiBase自动加载类、引用文件的方法。分享给大家供大家参考,具体如下: 在Yii2中这个函数是用来加载类的,没有直接引用文件的相关实现。但是这个也可以用来引用文件。
我是 PHP 自动加载的新手,在我的最新项目中需要 Horde_Text_Diff。我正在使用 Horde_Autoloader 来自动加载所需的文件,但是,我没有正确使用它。据我所知,互联网上没有一
我正在将 Symfonys Autoloader 用于具有以下文件夹/类结构的项目: App +- Package1 | +- Package2 +- Class1.php | - Interfa
我目前正在用 PHP 对我的框架进行编程(主要是出于教育原因,也是一种打发时间的方式)。我编写了一个自动加载器,它会自动扫描目录树并检测其中的所有类,并按以下格式创建一个数组: Array(
我有一个非常有趣的困境。我正在开发 CVS 存储库的 Perl 脚本接口(interface),并创建了 Perl 对象来表示 Modules , Paths , 和 Files .由于Modules
我被困在一个非常基本的问题上: 我正在尝试使用 Laravel,我使用 Composer 安装在我的 Windows 7 上。当我尝试使用 Wamp 在本地访问我的网站时,出现错误: Warning:
我目前正在开发一个需要从其父目录访问类的 Laravel 项目。 Composer .json > PSR-4: "psr-4": { ... "ModuleA
我将下面的代码作为一个自动加载类,但是看起来 clean 方法根本不起作用,它总是退回到 dirty 方法。 我是否错误地使用了 spl_autoload?如果是这样,正确(更好)的方法是什么?这是低
我正在学习 fat free 框架,但我遇到了一个问题。 我试用了 F3 Autoloader 并得到了这个: Internal Server Error Fatal error: Class 'Ga
我正在运行一个 Silex 小应用程序。试图让某种结构继续下去。 这是我的composer.json: { "require": { "silex/silex": "~1.3"
Kernel#autoload记录如下: Registers filename to be loaded (using Kernel::require) the first time that mod
我一直在使用 AUTOLOAD 在 Perl 中创建我的访问器,但我遇到了这种困惑(我已经搜索过 google 和 perldoc)。 我有这个代码: package Class; sub new {
我正在使用 CodeIgniter 4 的最新“master”分支 我有一个要自动加载的库。实际上,我希望拥有“一个”index.php(具有元数据、基本 html 结构等),通过它我可以通过我的"t
我们可以使用Autoloader跟踪是否已从 S3 存储桶加载的文件。我关于 Autoloader 的问题:有没有办法读取 Autoloader 数据库以获取已加载文件的列表? 我可以在 AWS Gl
单步执行供应商提供的库,一个调用是AUTOLOAD'ed,由UNIVERSAL::can() 捕获的coderef,然后调用该coderef。我相信调用是通过 DynaLoader 从已编译的库调用例
我是一名优秀的程序员,十分优秀!