一般来说,.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
您可以在单独的目录或文件下组织其他内容,例如lib/example_class/foo.rb
可能包含:
class ExampleClass::Foo
# ...
end
您可以一直保持链接autoloads
。这样做的好处是只加载实际引用的模块。
有时您会希望将 a 推迟require
到类实现中的某个地方。如果您想避免在一个繁重的库中加载,除非使用特定功能,否则此功能很有用,在一般情况下不太可能使用此功能。
例如,您可能不想加载 YAML 库,除非您正在进行一些调试:
def debug_export_to_yaml
require 'yaml'
YAML.dump(some_stuff)
end
如果您查看常见 Ruby gem 的结构,“入口点”通常是库的顶层或包含此库的实用程序脚本。因此,举个例子ExampleLibrary
,您的切入点lib/example_library.rb
将被构造为按需包含其余部分。您可能还有一个脚本bin/library_tool
可以为您执行此操作。
至于什么时候加载东西,如果有很大的机会被使用,那就提前加载它以早点付出代价,即所谓的“急切加载”。如果它被使用的可能性很小,请按需加载它,或者将其“延迟加载”,因为它被称为。
查看一些简单但流行的 gem 的来源,以了解大多数人如何构建他们的应用程序。