gpt4 book ai didi

ruby - 将目录表示为对象

转载 作者:太空宇宙 更新时间:2023-11-03 16:17:01 24 4
gpt4 key购买 nike

我正在构建一个工具,用于创建目录并呈现位于嵌套文件结构中的 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
  • 但在我的项目中,它们被称为三个"template":gemglimethadone(或者我应该开始称它们为骨架?因为包含“模板文件”?)
  • 我的想法是“渲染 gem 模板”
    • 真正的意思是“在 gem 目录中呈现所有 erb 模板”

目前,我认为一个重要的基础对象是 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 类?

最佳答案

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

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

class SomeDir < Pathname
end

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

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

关于ruby - 将目录表示为对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41423374/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com