Ruby File.open奇怪的行为

Ruby File.open奇怪的行为,ruby,file,Ruby,File,我发现文件有一种非常奇怪的行为 [3] pry():1> File.zero?(file.path) => true [4] pry():1> file.size => 3894 [5] pry():1> File.zero?(file.path) => false 可以在bash中检查[3]和[5]中的实际文件大小 这种行为有什么解释吗?前面要提到的一件事是,file.class可能是file或Tempfile,这两种情况都会发生。您看到这种看似奇怪的行为

我发现文件有一种非常奇怪的行为

[3] pry():1> File.zero?(file.path)
=> true
[4] pry():1> file.size
=> 3894
[5] pry():1> File.zero?(file.path)
=> false
可以在bash中检查
[3]
[5]
中的实际文件大小


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

您看到这种看似奇怪的行为的原因是,每个
文件
对象都有一个属性来封装文件的公共状态信息,只有在执行某些操作时才会更新触发更新的。在这种情况下,触发器是您对文件调用
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>
irb(main):021:0*f=File.new“out”,“w”
=> #
irb(主):022:0>f。写“hi”
=> 2
irb(主):023:0>File.zero?f、 路径
=>正确
irb(主):024:0>f.stat
=> #
irb(main):025:0>f.size#触发更新
=> 2
irb(主):026:0>File.zero?f、 路径
=>错误
irb(主):027:0>f.stat
=> #
尽管如此,我认为对
文件
对象调用
write
应该会触发更新


编辑:我弄明白了为什么
write
不会触发更新
write
文件的父类(
IO
)的一种方法。但是
size
stat
都是
文件的方法。因此,必须在
文件
中实现
写入
方法,以便访问(或了解)
stat
。我怀疑对
文件中实现的方法的任何调用都将更新
stat

显示
[1]
[2]
中发生的情况可能会有所帮助。你写文件了吗?没有,我在检查路径有没有可能是网络文件服务器的问题?NFS以前做过一些奇怪的事情…