将 File::Stat 转换为哈希 Ruby

5

想知道是否有一种方法可以将

的输出转换为
File.stat("/tmp/somefile")
=> #<File::Stat dev=0x80a, ino=553198, mode=0100664, nlink=1, uid=1000, gid=1000, rdev=0x0, size=0, blksize=4096, blocks=0, atime=Wed Aug 06 19:04:30 +0530 2014, mtime=Wed Aug 06 19:04:30 +0530 2014, ctime=Wed Aug 06 19:04:30 +0530 2014>

转换为哈希表?


它最初是一个 Ruby 对象吗?它是如何写入文件的? - dax
@dax 抱歉,我不明白你的问题是什么?这只是一个随机文件。我使用 touch /tmp/somefile 创建了它。所以基本上该文件是空的(或者其他任何东西)。但是当我在 Ruby 中使用标准类 http://ruby-doc.org/core-1.9.3/File/Stat.html 获取它的状态时,我得到的输出是我想要转换成哈希表的内容。 - shivam
1
@shivam 很好的问题。 - Arup Rakshit
这里的目标是什么?没有自然的方法可以做到这一点... - Max
@Max 很遗憾,我的程序已经采用了完全不同的方法,但是我问这个问题只是为了澄清是否有可能(以自然的方式)。 - shivam
显示剩余2条评论
2个回答

1

我认为 File::Stat 没有提供这样的方法。您可以像这样猴子补丁类来提供类似的东西:

File::Stat.class_eval do
  def to_hash
    meths = self.methods - self.class.superclass.instance_methods - [__callee__]
    meths.each_with_object({}) do |meth, acc|
      acc[meth.to_s] = self.send(meth) if self.method(meth).arity == 0
    end
  end
end

这会提取对象的所有实例方法(仅限于在File::Stat中定义的,不包括祖先类的方法),并将它们放入一个哈希表中。它会忽略任何带有参数的方法。

1

我不确定这是否是最美观的解决方案,但它有效:

h = Hash.new
f = File.stat('file.rb')

f.methods[1..17].each do |m|
  h[m] = f.send m
end

h

#=> {:dev=>64770, :dev_major=>253, :dev_minor=>2, :ino=>1315340, :mode=>33204, :nlink=>1, :uid=>1000, :gid=>1000, :rdev=>0, :rdev_major=>0, :rdev_minor=>0, :size=>1553, :blksize=>4096, :blocks=>8, :atime=>2014-02-17 17:43:13 +0100, :mtime=>2014-02-17 17:43:13 +0100, :ctime=>2014-02-17 17:43:13 +0100} 

我会有点不舒服,指定索引到methods生成的列表中。我认为在Ruby版本之间,序数不能保证保持不变。 - Mark Thomas
我会明确指定所需的方法(就像@ArupRakshit在这里回答过但现在已经删除了一样)。 - Mark Thomas
@MarkThomas,同意,这真的不是最好的方法,但是虽然ArupRakshit的方法比较稳定,但谁能保证方法名称在版本之间不会改变呢?无论如何,我认为它都很hack-y。我喜欢kardeiz的方法,可以通过编程方式删除不需要的方法,但我找不到一种方式仅保留所需的方法。 - dax

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接