gpt4 book ai didi

Ruby File.open 奇怪的行为

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

我发现 File 的一个非常奇怪的行为

[3] pry():1> File.zero?(file.path)
=> true
[4] pry():1> file.size
=> 3894
[5] pry():1> File.zero?(file.path)
=> false

[3][5] 中的真实文件大小可以通过在 bash 中检查它们来确认。

对这种行为有解释吗?之前要提到的一件事是 file.class 可能是 FileTempfile,这两种情况都会发生。

最佳答案

您看到这种看似奇怪的行为的原因是因为每个 File 对象都有一个 File::Stat object封装有关文件的公共(public)状态信息,这些信息仅在执行某些触发更新的操作时才更新。在这种情况下,触发器是您在文件上调用 size。您可以检查 stat 对象以查看时间戳。

这是一个完全可重现的示例,其中包含 stat 调用。

irb(main):021:0* f = File.new "out", "w"
=> #<File:out>
irb(main):022:0> f.write "hi"
=> 2
irb(main):023:0> File.zero? f.path
=> true
irb(main):024:0> f.stat
=> #<File::Stat dev=0x801, ino=1062714, mode=0100664, nlink=1, uid=1000, gid=1000, rdev=0x0, size=0, blksize=4096, blocks=0, atime=2015-11-05 15:50:25 -0800, mtime=2015-11-05 15:52:08 -0800, ctime=2015-11-05 15:52:08 -0800>
irb(main):025:0> f.size # triggers an update
=> 2
irb(main):026:0> File.zero? f.path
=> false
irb(main):027:0> f.stat
=> #<File::Stat dev=0x801, ino=1062714, mode=0100664, nlink=1, uid=1000, gid=1000, rdev=0x0, size=2, blksize=4096, blocks=8, atime=2015-11-05 15:52:47 -0800, mtime=2015-11-05 15:52:45 -0800, ctime=2015-11-05 15:52:45 -0800>

不过,我认为在 File 对象上调用 write 应该会触发更新。

编辑:我想通了为什么 write 不会触发更新。 writeFile 的父类(IO) 的一个方法。但是sizestat都是File的方法。因此,必须在 File 中实现 write 方法才能访问(或了解)stat。我怀疑对 File 中实现的方法的任何调用都会更新 stat

关于Ruby File.open 奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33556820/

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