我从Ruby编程语言开始,在开始研究Rails框架之前,我有兴趣深入了解它。
我目前有点失望,因为每个人都只关心Rails框架,而语言的其他方面只是没有深入讨论,比如它的类加载机制。
考虑到我是从做一些桌面/控制台实验开始的,我想更好地理解以下几点:
谢谢。
发布于 2013-04-18 21:06:22
一般来说,为每个Ruby类创建一个单独的.rb文件是一种很好的做法,除非这些类具有实用程序性质,而且过于琐碎,无法保证分离。它的一个实例将是一个自定义异常派生类,其中将它放入一个单独的文件中会比它的价值更麻烦。
传统认为,类的名称和文件名是相关的。在类被称为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链接起来。这具有只加载实际引用的模块的优点。
有时,您可能希望将require推迟到类实现中的某个位置。如果您想避免加载大量的库,除非使用了特定的特性,否则这是非常有用的,因为在普通情况下不太可能使用该特性。
例如,除非正在进行调试,否则可能不希望加载YAML库:
def debug_export_to_yaml
require 'yaml'
YAML.dump(some_stuff)
end如果您查看常见Ruby宝石的结构,“入口点”通常是库的顶层或包含此库的实用程序脚本。因此,以ExampleLibrary为例,您的入口点将是lib/example_library.rb,它的结构将包括随需应变的其余部分。您还可能有一个脚本bin/library_tool为您执行此操作。
至于什么时候加载东西,如果有很高的机会被使用,提前加载它以支付价格,因此所谓的“急装”。如果它被使用的可能性很低,那么按需加载它,或者让它被称为“懒散加载”。
看看一些简单但流行的宝石的来源,了解大多数人是如何构造他们的应用程序的。
发布于 2013-04-18 21:10:59
我试着帮你做第一个:
这取决于这些类之间的关系有多密切。让我们看看几个例子。看看这个类:https://github.com/resque/resque/blob/master/lib/resque.rb,它"imports"几个类的功能,尽管它们一起工作,但它们并不紧密相关,不能捆绑在一起。
另一方面,看看这个模块:https://github.com/resque/resque/blob/master/lib/resque/errors.rb。它捆绑了5个不同的类,但是这些类确实属于一个类,因为它们本质上都是相同的。
此外,从设计的角度来看,thump的一个很好的规则可能是问自己,还有谁在使用这个类/功能(意味着代码库的其他部分需要它)?
假设您希望表示由一个Click执行的WheelScroll和Mouse。在这个琐碎的例子中,将这些类捆绑在一起会更有意义:
module ComputerPart
class Mouse; end
class WheelScroll; end
class Click; end
end最后,我建议您仔细阅读这些流行项目的代码,以了解社区通常是如何做出这些决定的。
发布于 2013-04-18 21:00:57
1.)我遵循这种做法,但没有必要,如果需要,可以将一堆类放在一个文件中。
2.)如果类位于同一个文件中,则在运行脚本时它们都是可访问的。如果它们位于单独的文件中,那么您应该需要它们,也可以要求文件(Self)所在的整个目录。
(3)是的,它应该在文件的顶部。
4.)在ruby中,所有东西都是从主对象下来的,解释器只负责为您创建它。如果您正在编写OO,而不仅仅是脚本,那么入口点将是您调用的第一个类的init方法。
5.)是的,在程序运行之前,它会加载所有的依赖项。
6.)我认为它可以做到这一点,您所要做的就是要求在文件顶部找到适当的文件,然后您可以按照您的意愿使用它们,而不必再次隐式加载它们。
https://stackoverflow.com/questions/16092838
复制相似问题