将File::Stat转换为hash ruby

将File::Stat转换为hash ruby,ruby,Ruby,想知道有什么方法可以转换 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, ctim

想知道有什么方法可以转换

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>
File.stat(“/tmp/somefile”)
=> #

散列?

我认为
文件::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

这会将对象的所有实例方法(以及仅在
文件::Stat
中定义的方法,无祖先)拉入哈希。它省略了任何接受参数的方法。

不确定这是否是最漂亮的解决方案,但它可以工作:

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} 

它最初是一个ruby对象吗?它是如何写入文件的?@dax对不起,我不明白你的问题?这只是一些随机文件。我使用
touch/tmp/somefile
创建了它。所以基本上文件是空的。(也可以是其他任何东西)。但是,当我使用标准类在ruby中获取其stat时,我得到的输出是我想要转换为散列的内容。@shivam问得好。@shivam,抱歉误解了您的意思!为什么没有
#to_h
。我在想……:)在
方法生成的列表中指定索引会让我有点不舒服。我不认为Ruby版本之间的顺序保证是相同的。我会明确地指定所需的方法(就像一个答案@ArupRakshit在这里有,但后来被删除了)。@MarkThomas同意,这确实不是最好的方法,但尽管ArupRakshit的方法有点坚固,谁说方法名在不同版本之间不会改变?我觉得不管怎样你切下来都很粗糙。我喜欢kardeiz以编程方式删除不需要的方法,但我找不到一种只使用所需方法的方法。