在ruby-doc上,文档条目File::exist?和File::exists?不同的语义重复:一个条目表示返回trueif file_name是一个目录; 另一个说true如果file_name是文件则返回.
我认为这两个条目都不正确.这两种方法似乎都是在file.cusing 中实现的rb_file_exist_p,fstat()如果传递的值是IO,或者stat()它是一个字符串,它似乎试图调用.双方fstat()并stat()返回0成功和-1误差,这是传回rb_file_exist_p,并变成了一个布尔结果.在我看来,这
我对方法中(缺乏)差异的理解是否正确,是否值得建议对文档进行更改?
mu *_*ort 21
请注意,此问题的答案取决于Ruby版本.查看更新版本Ruby的其他答案.
如果我们查看C源代码,我们会看到:
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);
Run Code Online (Sandbox Code Playgroud)
所以File.exist?并且File.exists?完全相同,相应的文档是:
Return <code>true</code> if the named file exists.
Run Code Online (Sandbox Code Playgroud)
在rb_file_exist_pC函数只是一个非常简单包装的rb_stat,那是在一个包装STAT宏,STAT仅仅是为一个便携包装stat系统调用.因此,上面的文档是正确的:如果文件存在则File#exist?返回true.
如果我们检查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.
*
*/
Run Code Online (Sandbox Code Playgroud)
所以它看起来像文档生成器被越来越困惑,因为Dir.exist?和File.exist?中记载file.c,即使Dir是在定义dir.c.
潜在的问题似乎是源代码安排与文档生成器所期望的不匹配,结果是混淆和不正确的文档.我不知道应该如何解决这个问题.
小智 7
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);
Run Code Online (Sandbox Code Playgroud)
rb_file_exists_p 包含这一行:
rb_warning("%sexists? is a deprecated name, use %sexist? instead", s, s);
Run Code Online (Sandbox Code Playgroud)
所以你应该坚持下去File.exist?.
小智 5
由于File.exists?不推荐使用ruby 2.2.0 ,请使用File.exist?
http://ruby-doc.org/core-2.2.0/File.html#exist-3F-method