15

ruby -docFile::exist?では、およびのドキュメントエントリFile::exists?が異なるセマンティクスで複製されます。1つのエントリは、がディレクトリであるtrue場合に戻ると言います。file_nameもう1つは、がファイルのtrue場合に返されると言いfile_nameます。

どちらのエントリも正しくないと思います。file.cどちらのメソッドも、を使用して実装されているようです。これは、渡された値がIOの場合、または文字列の場合rb_file_exist_pに呼び出そうとしているようです。とは成功とエラーの両方に戻り、これはに戻され、ブール結果に変換されます。それは私には思われるfstat()stat()fstat()stat()0-1rb_file_exist_p

  1. コードを読みやすくする方法は2つあります。セマンティックの違いはありません
  2. どちらも実際にはファイルが存在するかどうかには関係しませんが、ファイル、ディレクトリ、ソケット、FIFOなどのファイルのようなアイテムが存在するかどうかに関係します。
  3. おそらくドキュメントは、メソッドがファイルのようなセマンティクスを持つものが存在するかどうかを呼び出し元に伝えると言うことができますが、より具体的なテストはそれが実際に何であるかを教えます:例えば、ディレクトリ?、ファイル?、ソケット?等

メソッドの違い(の欠如)についての私の理解は正しいですか、そしてドキュメントへの変更を提案する価値がありますか?

4

4 に答える 4

24

この質問に対する答えは、Rubyのバージョンによって異なることに注意してください。Rubyの新しいバージョンについては、他の回答を参照してください。AFAIKexists?は2.2で非推奨になりました。


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);

したがってFile.exist?、とFile.exists?はまったく同じものであり、対応するドキュメントは次のとおりです。

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

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.
 *
 */

したがって、で定義されているにもかかわらず、とがで文書化されているためDir.exist?、ドキュメントジェネレータが混乱しているように見えます。File.exist?file.cDirdir.c

根本的な問題は、ソースコードの配置がドキュメントジェネレータが期待するものと一致せず、結果が混乱してドキュメントが正しくないことであると思われます。しかし、これをどのように修正すべきかわかりません。

于 2013-01-13T06:28:46.777 に答える
11

ruby 2.2.0File.exists?は非推奨であるため、代わりに使用してくださいFile.exist?

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

于 2017-06-14T10:48:55.950 に答える
9

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?ます。

于 2017-09-06T07:08:51.933 に答える
2

gitpullはそれをなくしました-これはここで修正されました-なぜruby-docとapidockで生成されたdocoがまだ間違っているのかわかりません

于 2013-01-13T11:14:15.777 に答える