doctree icon indicating copy to clipboard operation
doctree copied to clipboard

File.fnmatchで実際の挙動と異なる表記を削除

Open ksss opened this issue 2 years ago • 3 comments

File::FNM_PATHNAMEは1.8.0から導入されたので**は使用できるはずです。 File::FNM_EXTGLOBは2.0.0から導入なので残します。 Pathname#fnmatchおよびPathname#fnmatch?のワイルドカードの記述は厳密にはバージョン分岐するべきですが、File.fnmatchおよび``File#fnmatch?`と二重管理になるので削除し、くわしくは参照を見ていただくのが良いと思います。

"[[m:Dir.glob]] とは違って `**/' は使用できません。"は17年前のcommitから入っている文言が今まで引き継がれていたようです。 https://github.com/rurema/doctree/commit/f6eb65532aa7ccd63b203ce4f3e2410fc2768104

ksss avatar Oct 31 '23 01:10 ksss

**/ 対応は ruby 1.8.5 からのようです。

$ nerdctl run --rm -it ghcr.io/ruby/all-ruby env LANG=C.UTF-8 ALL_RUBY_SINCE=ruby-1.6 ./all-ruby -e 'p File.fnmatch("/*/*.rb", "/foo/bar/baz.rb"), File.fnmatch("/**/*.rb", "/foo/bar/baz.rb"), File.fnmatch("/*/*.rb", "/foo/bar/baz.rb", File::FNM_PATHNAME), File.fnmatch("/**/*.rb", "/foo/bar/baz.rb", File::FNM_PATHNAME)'
ruby-1.6.0            -e:1: undefined method `fnmatch' for File:Class (NameError)
                  exit 1
...
ruby-1.6.8            -e:1: undefined method `fnmatch' for File:Class (NameError)
                  exit 1
ruby-1.8.0            true
                      true
                      false
                      false
...
ruby-1.8.5-p231       true
                      true
                      false
                      false
ruby-1.8.6-preview1   true
                      true
                      false
                      true
...
ruby-3.3.0-preview1   true
                      true
                      false
                      true

doc/ChangeLog/ChangeLog-1.9.3

        * dir.c (fnmatch): directory recursion '**/' can be used with
          File::FNM_PATHNAME. [ruby-dev:22901]

とあって、http://blade.ruby-lang.org/ruby-dev/22901 には

うーん、「fnmatchはパターンマッチャ」であるという観点からは
逆に「**/があるのでFNM_PATHNAMEは要らない」というのは受け入
れがたいです。「FNM_PATHNAMEが指定されていない時には**は*と
同じ意味」ならOK。

とあるので、詳しく説明するなら、 FNM_PATHNAME が指定されたときは glob と同じ意味になって、 FNM_PATHNAME が指定されていないときは */ にもマッチするので、 **/*/ と同じ意味になる (のでわざわざ **/ と書く必要性はない) ということになりそうです。

znz avatar Oct 31 '23 09:10 znz

いっそfnmatchの"ワイルドカードとして〜"の部分を削除して、オプション定数に説明を委ねるのはいかがでしょう?

ksss avatar Nov 06 '23 13:11 ksss

いっそfnmatchの"ワイルドカードとして〜"の部分を削除して、オプション定数に説明を委ねるのはいかがでしょう?

完全に削除してしまうと大まかに知りたいだけの時に不便になりそうなので、 else の方からも [[m:Dir.glob]] とは違って`{}' は使用できません。 を削ってオプション定数に詳細な説明を追加するぐらいが良さそうかなと思いました。

znz avatar Dec 05 '23 13:12 znz