我开始使用Ruby编程语言,在开始研究Rails框架之前,我有兴趣深入理解它.
我目前有点失望,因为每个人都只关心Rails框架,而且语言的其他方面都没有深入讨论,比如它的类加载机制.
考虑到我开始做一些桌面/控制台实验,我想更好地理解以下事项:
谢谢.
一般而言,.rb为每个Ruby类创建一个单独的文件是一个很好的做法,除非这些类具有实用性,并且过于简单,无法保证分离.这个实例将是一个自定义的Exception派生类,将它放在一个单独的文件中会比它的价值更麻烦.
传统认为类的名称和文件名是相关的.在调用类的地方,调用ExampleClass该文件,该文件example_class的"下划线"版本.在某些情况下,你会坚持这个惯例,但只要你保持一致就不应该有问题.如果你遵循惯例,Rails ActiveSupport自动加载器将帮助你很多,所以很多人都遵循这种做法.
同样的,你会想你的应用程序整理到文件夹一样lib,并bin分离从后端库的命令行脚本.命令行脚本通常没有.rb扩展名,而库应该是.
说到require这一点,应该谨慎使用.如果你正确地构建了库文件,那么一旦你调用require了顶层文件,它们就会自动加载.这是通过该autoload功能完成的.
例如,lib/example_class.rb可能看起来像:
class ExampleClass
class SpecialException < Exception
end
autoload(:Foo, 'example_class/foo')
# ...
end
Run Code Online (Sandbox Code Playgroud)
您可以在单独的目录或文件下组织其他内容,例如lib/example_class/foo.rb可以包含:
class ExampleClass::Foo
# ...
end
Run Code Online (Sandbox Code Playgroud)
你可以一直保持链接autoloads.这具有仅加载实际引用的模块的优点.
有时您会希望将a推迟require到类实现中的某个位置.如果您希望避免在繁重的库中加载,除非使用特定功能,此功能在普通情况下不可能使用,否则这非常有用.
例如,您可能不想加载YAML库,除非您正在进行一些调试:
def debug_export_to_yaml
require 'yaml'
YAML.dump(some_stuff)
end
Run Code Online (Sandbox Code Playgroud)
如果查看常见Ruby gem的结构,"入口点"通常是库的顶层或包含此库的实用程序脚本.因此,举一个例子ExampleLibrary,您的入口点将lib/example_library.rb被构造为包括其他按需.您可能还有一个脚本bin/library_tool可以为您执行此操作.
至于什么时候加载东西,如果有很高的机会被使用,请提前加载它以便提前付出代价,所以称为"急切加载".如果它被使用的可能性很小,可以根据需要加载它,或者在它被调用时保持"延迟加载".
看看一些简单但流行的宝石的来源,以了解大多数人如何构建他们的应用程序.
| 归档时间: |
|
| 查看次数: |
2400 次 |
| 最近记录: |