首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby类加载机制

Ruby类加载机制
EN

Stack Overflow用户
提问于 2013-04-18 20:51:06
回答 3查看 3.2K关注 0票数 4

我从Ruby编程语言开始,在开始研究Rails框架之前,我有兴趣深入了解它。

我目前有点失望,因为每个人都只关心Rails框架,而语言的其他方面只是没有深入讨论,比如它的类加载机制。

考虑到我是从做一些桌面/控制台实验开始的,我想更好地理解以下几点:

  1. 将每个Ruby类放在单独的Ruby文件中是一种良好的实践吗?(*.rb)
  2. 如果我有,比如说..。10节课..。它们都相互引用,通过实例化并调用对方的方法,我是否应该在每个文件中添加一个‘required’语句,以说明该文件中的类需要哪些类?(就像我们在每个Java类文件中使用'import‘语句一样?)
  3. 在类声明之前或之后放置“require”语句有区别吗?
  4. 什么可以被认为是正确的Ruby程序的“入口点”?我觉得任何.rb脚本都足够了,因为语言没有像C或Java那样的约定,我们总是需要一个方法的“主”函数。
  5. 在Ruby程序的执行过程中,类加载是否被认为是一个“阶段”?我们应该在一开始就加载应用程序所需的所有类吗?
  6. 在我们运行需要类的代码时,解释器本身不应该负责查找和加载类吗?通过搜索$LOAD_PATH变量中的路径,就像Java对其$CLASSPATH所做的那样?

谢谢。

EN

回答 3

Stack Overflow用户

发布于 2013-04-18 21:06:22

一般来说,为每个Ruby类创建一个单独的.rb文件是一种很好的做法,除非这些类具有实用程序性质,而且过于琐碎,无法保证分离。它的一个实例将是一个自定义异常派生类,其中将它放入一个单独的文件中会比它的价值更麻烦。

传统认为,类的名称和文件名是相关的。在类被称为ExampleClass的情况下,文件被称为example_class,也就是该类的“突出”版本。在某些情况下,你会放弃这个惯例,但只要你坚持下去,就不会有问题。如果您遵循惯例,Rails ActiveSupport自动加载程序将帮助您很大程度上解决问题,因此很多人都遵循这种做法。

同样,您需要将应用程序组织到像libbin这样的文件夹中,以便将命令行脚本从后端库中分离出来。命令行脚本通常没有.rb扩展,而库应该有.

当涉及到require时,应该谨慎地使用它。如果您正确地构造了库文件,那么一旦在顶层调用了require,它们都可以自动加载。这是通过autoload特性完成的。

例如,lib/example_class.rb看起来可能如下:

代码语言:javascript
复制
class ExampleClass
  class SpecialException < Exception
  end

  autoload(:Foo, 'example_class/foo')

  # ...
end

您可以将其他内容组织在单独的目录或文件中,比如lib/example_class/foo.rb,它可以包含:

代码语言:javascript
复制
class ExampleClass::Foo
  # ...
end

你可以一直把autoloads链接起来。这具有只加载实际引用的模块的优点。

有时,您可能希望将require推迟到类实现中的某个位置。如果您想避免加载大量的库,除非使用了特定的特性,否则这是非常有用的,因为在普通情况下不太可能使用该特性。

例如,除非正在进行调试,否则可能不希望加载YAML库:

代码语言:javascript
复制
def debug_export_to_yaml
  require 'yaml'

  YAML.dump(some_stuff)
end

如果您查看常见Ruby宝石的结构,“入口点”通常是库的顶层或包含此库的实用程序脚本。因此,以ExampleLibrary为例,您的入口点将是lib/example_library.rb,它的结构将包括随需应变的其余部分。您还可能有一个脚本bin/library_tool为您执行此操作。

至于什么时候加载东西,如果有很高的机会被使用,提前加载它以支付价格,因此所谓的“急装”。如果它被使用的可能性很低,那么按需加载它,或者让它被称为“懒散加载”。

看看一些简单但流行的宝石的来源,了解大多数人是如何构造他们的应用程序的。

票数 5
EN

Stack Overflow用户

发布于 2013-04-18 21:10:59

我试着帮你做第一个:

  1. 将每个Ruby类放在单独的Ruby文件中是一种良好的实践吗?(*.rb)

这取决于这些类之间的关系有多密切。让我们看看几个例子。看看这个类: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执行的WheelScrollMouse。在这个琐碎的例子中,将这些类捆绑在一起会更有意义:

代码语言:javascript
复制
module ComputerPart
   class Mouse; end
   class WheelScroll; end
   class Click; end
end

最后,我建议您仔细阅读这些流行项目的代码,以了解社区通常是如何做出这些决定的。

票数 1
EN

Stack Overflow用户

发布于 2013-04-18 21:00:57

1.)我遵循这种做法,但没有必要,如果需要,可以将一堆类放在一个文件中。

2.)如果类位于同一个文件中,则在运行脚本时它们都是可访问的。如果它们位于单独的文件中,那么您应该需要它们,也可以要求文件(Self)所在的整个目录。

(3)是的,它应该在文件的顶部。

4.)在ruby中,所有东西都是从主对象下来的,解释器只负责为您创建它。如果您正在编写OO,而不仅仅是脚本,那么入口点将是您调用的第一个类的init方法。

5.)是的,在程序运行之前,它会加载所有的依赖项。

6.)我认为它可以做到这一点,您所要做的就是要求在文件顶部找到适当的文件,然后您可以按照您的意愿使用它们,而不必再次隐式加载它们。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16092838

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档