将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以编程方式删除不需要的方法,但我找不到一种只使用所需方法的方法。