将目录表示为对象

时间:2017-01-02 08:18:45

标签: ruby oop

我正在构建一个工具,用于生成目录并呈现嵌套文件结构中的erb个文件。

例如,采用如下文件结构:

tmp
├── gem
│   ├── another_dir
│   │   └── bar.erb
│   ├── baz.erb
│   └── some_dir
│       └── foo.erb
├── gli
│   └── some_dir
│       └── foo.erb
├── methadone
│   └── some_dir
│       ├── foo.erb
│      

我的项目会像这样谈论这个结构:

  • 有一个名为tmp
  • 的真实目录
  • 里面有三个真实的目录:gemglimethadone
  • 但是在我的项目中,这些将被称为三个“模板”:gemglimethadone(或者我应该开始称它们为骨架?因为包含“模板”文件“?)
  • 我的想法是“渲染gem模板”
    • 真正意味着“渲染erb目录中的所有gem模板”

目前,我认为一个重要的基础对象是Dir对象。

但是,当我查看ruby中的Dir对象时,它似乎没有给我我期望的功能。

例如,我希望能够询问目录:

  • 你叫什么名字?
  • 你的绝对路径是什么?
  • 你内心递归的所有路径是什么?
  • 你里面的所有目录是什么?
  • 里面的所有文件是什么?

我很惊讶Dir类的实例似乎没有响应任何这些消息。

相反,似乎此功能已构建到FileFindDir类的各种类方法中。

所以我建立了自己的SomeDir类:

require 'fileutils'
require 'find'

class SomeDir
  include FileUtils
  attr_reader :path
  def initialize path
    @path = File.expand_path(path)
    mkdir_p path
  end

  def name
    File.basename path
  end

  def find
    Find.find(path).to_a
  end

  def dirs
    Dir.glob(path + "/**/*/")
  end

  def files
    Dir.glob(path + "/**/*")
  end
end

但是对我来说似乎很奇怪,我包括所有这些功能,比如FileFind类,我不会继承任何类。

我是否重新发明轮子或忽略了如何将目录表示为ruby中的对象? 我应该继承DirFile还是Find类?

1 个答案:

答案 0 :(得分:1)

正如您所注意到的,File和Dir只有很少的实例方法。该功能通常由带有String(= filename)参数的类方法提供。这使得很难从File或Dir继承。

Pathname有更多实例方法,并定义:

class SomeDir < Pathname
end

会帮助你,至少是一些方法。

作为奖励,许多Pathname方法返回路径名或路径名数组,因此链接方法并使用selectreject更容易。使用File或Dir,如果你得到一个文件名作为答案,它就是一个字符串,你需要在它上面使用另一个类方法。