`File :: exists?`和`File :: exists?`之间的区别

时间:2013-01-13 05:59:57

标签: ruby

ruby-doc上,File::exist?File::exists?的文档条目与不同的语义重复:如果true是目录,则一个条目返回file_name;另一个说如果true是文件,则返回file_name

我认为这两个条目都不正确。这两种方法似乎都是使用rb_file_exist_pfile.c中实现的,如果传递的值是IO,则似乎尝试调用fstat(),如果是字符串,则调用stat()。成功时fstat()stat()都会返回0,错误时返回-1,这会传回rb_file_exist_p,并变成布尔结果。在我看来

  1. 有两种方法可以更轻松地读取代码;没有语义差异
  2. 既不与现有的文件有关,也与类文件项是否存在有关,例如文件,dir,套接字,fifo等。
  3. 也许文档可以说这些方法告诉调用者是否存在具有类文件语义的东西,但是更具体的测试将告诉它实际上是什么:例如目录?,文件?,套接字?等
  4. 我对方法中(缺乏)差异的理解是否正确,是否值得建议对文档进行更改?

4 个答案:

答案 0 :(得分:20)

请注意,此问题的答案取决于Ruby版本。查看更新版本Ruby的其他答案。


如果我们查看C源代码,we see this

rb_cFile = rb_define_class("File", rb_cIO);
/* ... */
define_filetest_function("exist?", rb_file_exist_p, 1);
define_filetest_function("exists?", rb_file_exist_p, 1);

所以File.exist?File.exists?完全相同,相应的文档是:

Return <code>true</code> if the named file exists.

rb_file_exist_p C函数只是rb_stat的一个非常薄的包装器,它是STAT宏的包装器,STAT只是we find this的可移植包装器{1}}系统调用。因此,上述文档是正确的:如果文件存在,stat将返回File#exist?

如果我们检查true有关目录的文档代码段,Dir is defined in dir.c

file.c

因此文档生成器看起来很混乱,因为/* * Document-method: exist? * * call-seq: * Dir.exist?(file_name) -> true or false * Dir.exists?(file_name) -> true or false * * Returns <code>true</code> if the named file is a directory, * <code>false</code> otherwise. * */ Dir.exist?都记录在File.exist?中,即使是{{3}}。

潜在的问题似乎是源代码安排与文档生成器所期望的不匹配,结果是混淆和不正确的文档。我不知道应该如何解决这个问题。

答案 1 :(得分:6)

File.exist?File.exists?不再完全相同了。见https://github.com/ruby/ruby/blob/ruby_2_3/file.c#L5920

define_filetest_function("exist?", rb_file_exist_p, 1);
define_filetest_function("exists?", rb_file_exists_p, 1);

rb_file_exists_p包含以下行:

rb_warning("%sexists? is a deprecated name, use %sexist? instead", s, s);

所以你应该坚持File.exist?

答案 2 :(得分:5)

由于不推荐使用ruby 2.2.0 File.exists?,请使用File.exist?

http://ruby-doc.org/core-2.2.0/File.html#exist-3F-method

答案 3 :(得分:2)

git pull让它消失了 - 这是固定的here - 不确定为什么在ruby-doc和apidock上生成doco仍然是错误的