在ruby-doc上,File::exist?
和File::exists?
的文档条目与不同的语义重复:如果true
是目录,则一个条目返回file_name
;另一个说如果true
是文件,则返回file_name
。
我认为这两个条目都不正确。这两种方法似乎都是使用rb_file_exist_p
在file.c
中实现的,如果传递的值是IO,则似乎尝试调用fstat()
,如果是字符串,则调用stat()
。成功时fstat()
和stat()
都会返回0
,错误时返回-1
,这会传回rb_file_exist_p
,并变成布尔结果。在我看来
我对方法中(缺乏)差异的理解是否正确,是否值得建议对文档进行更改?
答案 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?
答案 3 :(得分:2)
git pull让它消失了 - 这是固定的here - 不确定为什么在ruby-doc和apidock上生成doco仍然是错误的