Skip to content

Dir: fchdir と for_fd を追加 (Ruby 3.3)#3309

Open
Watson1978 wants to merge 2 commits into
rurema:masterfrom
Watson1978:dir-fchdir-and-for-fd
Open

Dir: fchdir と for_fd を追加 (Ruby 3.3)#3309
Watson1978 wants to merge 2 commits into
rurema:masterfrom
Watson1978:dir-fchdir-and-for-fd

Conversation

@Watson1978

Copy link
Copy Markdown
Contributor

概要

Ruby 4.0 に存在するのにリファレンスに項目が無い [c:Dir] のメソッド 2 個を追加しました。
どちらも Ruby 3.3 で追加されたものです。

  • Dir.fchdir — ファイルディスクリプタでカレントディレクトリを変更する
  • Dir.for_fd — ファイルディスクリプタからパスを持たない [c:Dir] を作る

登場バージョン

実機で確認しました。どちらも 3.3 からです。

2.7.8 〜 3.2.11: なし
3.3.12 / 3.4.10 / 4.0.6: fchdir, for_fd

記述の根拠

  • Dir.fchdir はブロックなしで 0 を、ブロックありでブロックの評価結果を返し、
    変更はブロック実行中に限られます。ブロック引数は nil だったため、シグネチャは
    Dir.fchdir(fd) { ... } としました (rdoc の call-seq に合わせています)。
    例はカレントディレクトリを変更するので、同ファイルの Dir.chdir の例と同じ
    /var/spool/mail/usr のスタイルに揃えました。
  • Dir.for_fd は POSIX の fdopendir() を使い、非 POSIX 環境では
    [c:NotImplementedError] になります。返る [c:Dir] はパスを持たず、
    [m:Dir#path] が nil を返すことを実機で確認しました。
$ ruby -rtmpdir -e 'Dir.mktmpdir { |d| dir = Dir.new(d); p Dir.for_fd(dir.fileno).path }'
nil

検証

  • Dir.for_fd の例は 3.3 / 3.4 / 4.0 で実行して出力を確認しました。
  • rake check_blank_lines / check_indent_in_samplecode / check_single_space_indent
  • bitclust update --markdowntree=manual/api を 3.1 / 3.2 / 3.3 / 3.4 / 4.0 で実行し、
    エラーが出ないこと、登録されるメソッドが 0 / 0 / 2 / 2 / 2 件と 3.3 追加どおりに
    なることを確認しました。

🤖 Generated with Claude Code

どちらも Ruby 3.3 で追加されたメソッド。実機で確認し #@SInCE 3.3 で分岐した。

  Dir.fchdir  ファイルディスクリプタでカレントディレクトリを変更する
  Dir.for_fd  ファイルディスクリプタからパスを持たない Dir を作る

配置は関連メソッドの近くにした。fchdir は Dir.chdir の直後、for_fd は
Dir.new / Dir.open の後。あわせて Dir.chdir に fchdir への SEE を足した。

fchdir はブロックなしで 0、ブロックありでブロックの評価結果を返し、変更は
ブロック実行中に限られる。ブロック引数は nil なので、シグネチャは
Dir.fchdir(fd) { ... } とした (rdoc の call-seq に合わせた)。
例はカレントディレクトリを変更するため、同ファイルの Dir.chdir の例と同じ
/var/spool/mail・/usr のスタイルに揃えた。

for_fd は POSIX の fdopendir() を使い、非 POSIX 環境では NotImplementedError
になる。返る Dir はパスを持たず Dir#path が nil を返すことを実機で確認し、
例に示した。

bitclust のデータベース生成を 3.1 / 3.2 / 3.3 / 3.4 / 4.0 で実行してエラーが
出ないこと、登録されるメソッドが 0 / 0 / 2 / 2 / 2 件と 3.3 追加どおりに
なることを確認済み。for_fd の例は対象の全バージョンで実行して出力を確認した。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@znz

znz commented Jul 25, 2026

Copy link
Copy Markdown
Member

レビューありがとうございます。実機(all-ruby, Ruby 3.0.7〜4.0.6)で挙動を確認しました。

  • Dir.fchdir / Dir.for_fd とも 3.3 以降で追加(3.2 以前は respond_to? が false)で、#@since 3.3 の閾は正しいです。
  • Dir.fchdir(fd) はブロックなしで 0、ブロックありでブロックの評価結果を返し、カレントディレクトリが変わることを確認しました。
  • Dir.for_fd(fd)Dir を返し、pathnil になることを確認しました。
  • リンク先([m:Dir.chdir], [m:Dir#fileno], [m:Dir#path])はいずれも存在します。ネイティブ MDParser でのレンダリングも compileerror 0 でした。

1 点だけ修正をお願いできればと思います。

- **SEE** [m:Dir.fchdir] のバージョン閾

Dir.chdir のエントリに追加された - **SEE** [m:Dir.fchdir]#@since 3.3 の外にあります。

 p Dir.chdir("~/.ssh")        # => Errno::ENOENT
  • SEE [m:Dir.fchdir] ←ここが版で囲まれていない

#@SInCE 3.3

def fchdir(fd) -> 0


`Dir.chdir` 自体は全バージョンに存在するため、この SEE も 3.0〜3.2 で出力されますが、参照先の `Dir.fchdir` はそれらの版には存在しない(`#@since 3.3`)ので、**3.0〜3.2 でリンク切れになります**(`method/Dir/s/fchdir` へのリンクが生成されるのを 3.2 のレンダリングで確認しました)。

SEE 行を版で囲んでいただくのが良いと思います。

#@SInCE 3.3

  • SEE [m:Dir.fchdir]
    #@EnD

(任意)対称に、`Dir.fchdir` 側の `- **SEE**` に `[m:Dir.for_fd]` を、`Dir.for_fd` 側に `[m:Dir.fchdir]` を足しても良いかもしれません。

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Dir.chdir は全バージョンに存在するため、そこに置いた
- **SEE** [m:Dir.fchdir] が 3.0〜3.2 でも出力され、参照先の Dir.fchdir が
#@SInCE 3.3 で存在しないためリンク切れになっていた。SEE 行を #@SInCE 3.3 で囲む。

あわせて、対になる Dir.fchdir と Dir.for_fd に相互の SEE を追加した
(どちらも既に #@SInCE 3.3 の中なので版の問題はない)。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@Watson1978

Copy link
Copy Markdown
Contributor Author

レビューありがとうございます。ご指摘の SEE を版で囲み、任意とされていた相互 SEE も入れました。

- **SEE** [m:Dir.fchdir] の版ゲート

ご提案どおり #@since 3.3 / #@end で囲みました。

#@since 3.3
- **SEE** [m:Dir.fchdir]
#@end

(任意) 相互 SEE

Dir.fchdir 側に [m:Dir.for_fd]Dir.for_fd 側に [m:Dir.fchdir] を足しました。
どちらも既に #@since 3.3 ブロックの中なので、版の問題は起きません。

検証

この指摘を受けて、リンクの確認方法を「版ごとの DB のエントリ本文を走査する」形に
作り直しました。元の .md を見る方式だと #@since を評価しないので、今回のような
「参照元は全版にあるが参照先が新しい版にしかない」型の切れは原理的に拾えませんでした。

修正後、3.0 / 3.2 / 3.3 / 4.0 の DB を生成して Dir.md 由来の全エントリの
[m:...] / [c:...] を突き合わせ、いずれも NG 0 件です。

検出できていることの確認として、修正前の状態でも同じ検査をかけました。
3.2 でご指摘のものがそのまま出ます。

--- 修正前の 3.2
  NG 1 件
    [m:Dir.fchdir]  <- manual/api/_builtin/Dir.md (-dir/s.chdir._builtin)

rake check_formatcheck_blank_lines / check_indent_in_samplecode /
check_single_space_indent も通っています。

🤖 Generated with Claude Code

@znz

znz commented Jul 25, 2026

Copy link
Copy Markdown
Member

対応ありがとうございます。確認しました。

  • Dir.chdir 側の - **SEE** [m:Dir.fchdir]#@since 3.3 / #@end で囲まれ、Dir.fchdir / Dir.for_fd の定義ブロックともそれぞれ独立して #@end で閉じられていること(#@since/#@end の対応 depth 0)を確認しました。
  • 相互 SEE(Dir.fchdirDir.for_fd)の追加もありがとうございます。両メソッドは ## Class Methods 配下なので [m:Dir.fchdir] / [m:Dir.for_fd] のドット記法で正しく解決します。

3.0 / 3.3 で statichtml をビルドし、3.0 版では fchdir / for_fd ページが生成されず chdir ページにも言及が出ないこと(ゲート正常)、3.3 版では両ページが生成され相互リンクがすべて解決すること・compileerror 0 を確認しました。マージ可と考えます。

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