你如何在Ruby中创建分层类名?

时间:2011-02-06 20:47:57

标签: ruby

在Ruby中,名为Foo的类将使用class Foo定义,通过require 'foo'使用,并且将存在于$:[0]/foo.rb或类似的内容中。

但是Foo::Bar呢?是否会使用require 'foo/bar'调用它?它会住在$:[0]/foo/bar.rb吗?它将如何定义?

我非常习惯于Perl,对于个人项目,我会创建Project::UserProject::Text::IndexProject::Text::Search等嵌套类。然后我会创建一个像{{1}的文件}},以Project/Text/Index.pm开头,并通过package Project::Text::Index调用。

现在我在Ruby中开始一个项目,并且不知道如何做到这一点。出于某种原因,我读过的所有Ruby书籍或文档都没有提到perl风格的分层类命名。当他们提到继承时,它通常是通过像use Project::Text::Index;这样的简单组成的例子,这对我没有帮助。然而我认为必须有可能做我正在尝试的事情,因为Rails(仅举个例子)有类似class Foo < Bar的类。

2 个答案:

答案 0 :(得分:6)

您在这里结合了几个不相关的概念,即加载路径,继承和范围解析运算符。

当需要(或加载)文件时,require关键字的参数只被视为文件路径并附加到加载搜索路径(.rb扩展名对于require是可选的)。继承和嵌套在这里不起作用,任何文件都可以定义它想要的任何东西,例如:

require 'foo' # Looks for "foo.rb" in each of $:
require 'foo/bar' # Looks for "foo/bar.rb" in each of $:

嵌套类(以及模块,变量等)按预期定义,但使用范围解析运算符解析,例如:

class Foo
  def foo; 'foo'; end
  class Bar
    def bar; 'bar'; end
  end
end
Foo.new.foo # => "foo"
Foo::Bar.new.bar # => "bar"

请注意,类嵌套和继承与加载它们的文件的位置无关。对于类/模块结构似乎没有任何明确的约定,因此您可以自由地执行适合您的操作。编程Ruby书的Ruby Language页面也可能有用。

答案 1 :(得分:3)

您需要模块。如果您希望在Funthing::Text::Index中使用Funthing/Text/Index.rb标识的课程,并且需要require 'Funthing/Text/Index',则可以执行此操作:

# file Funthing/Text/Index.rb
module Funthing
  module Text
    class Index
      def do_the_twist()
        puts "Let's twist again!"
      end
    end
  end
end

然后像这样使用它:

require "Funthing/Text/Index"
c = Funthing::Text::Index.new

注意:文件层次结构是必需的,但(在我看来)是最佳做法。

相关问题