Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
wants to merge 2 commits into
base: master
Choose a base branch
from

Conversation

ksss
Copy link
Contributor

@ksss ksss commented Oct 31, 2023

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から入っている文言が今まで引き継がれていたようです。
f6eb655

`File::FNM_PATHNAME`は1.8.0から導入されたので`**`は使用できる。
`File::FNM_EXTGLOB`は2.0.0から導入なので残す。
くわしは`File.fnmatch`を参照してもらうことにする
@znz
Copy link
Member

znz commented Oct 31, 2023

**/ 対応は 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 が指定されていないときは */ にもマッチするので、 **/*/ と同じ意味になる (のでわざわざ **/ と書く必要性はない) ということになりそうです。

@ksss
Copy link
Contributor Author

ksss commented Nov 6, 2023

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

@znz
Copy link
Member

znz commented Dec 5, 2023

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

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants