我正在构建一个工具,用于生成目录并呈现嵌套文件结构中的erb
个文件。
例如,采用如下文件结构:
tmp
├── gem
│ ├── another_dir
│ │ └── bar.erb
│ ├── baz.erb
│ └── some_dir
│ └── foo.erb
├── gli
│ └── some_dir
│ └── foo.erb
├── methadone
│ └── some_dir
│ ├── foo.erb
│
我的项目会像这样谈论这个结构:
tmp
gem
,gli
和methadone
gem
,gli
和methadone
(或者我应该开始称它们为骨架?因为包含“模板”文件“?)gem
模板”
erb
目录中的所有gem
模板”目前,我认为一个重要的基础对象是Dir
对象。
但是,当我查看ruby中的Dir
对象时,它似乎没有给我我期望的功能。
例如,我希望能够询问目录:
我很惊讶Dir
类的实例似乎没有响应任何这些消息。
相反,似乎此功能已构建到File
,Find
和Dir
类的各种类方法中。
所以我建立了自己的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
但是对我来说似乎很奇怪,我包括所有这些功能,比如File
或Find
类,我不会继承任何类。
我是否重新发明轮子或忽略了如何将目录表示为ruby中的对象?
我应该继承Dir
,File
还是Find
类?
答案 0 :(得分:1)
正如您所注意到的,File和Dir只有很少的实例方法。该功能通常由带有String(= filename)参数的类方法提供。这使得很难从File或Dir继承。
Pathname有更多实例方法,并定义:
class SomeDir < Pathname
end
会帮助你,至少是一些方法。
作为奖励,许多Pathname方法返回路径名或路径名数组,因此链接方法并使用select
或reject
更容易。使用File或Dir,如果你得到一个文件名作为答案,它就是一个字符串,你需要在它上面使用另一个类方法。