Ruby でファイル名やパス名を扱う場合は Pathname クラス を使うと楽

Fileクラス(File.dirnameメソッド)などを使うよりも直感的で楽です。特に、相対パスと絶対パスを考慮しなければいけない場合に絶大な威力を発揮します。

具体例(準備)

まずrequireしないと始まりません。

require 'pathname'

さて、現在のディレクトリを以下のように/home/foobarとし、そのディレクトリを指すPathnameオブジェクトを生成します*1

pwd = Pathname('/home/foobar')

あとはこのオブジェクトにjoinメソッドでディレクトリやパスをくっつけていくことになります。

具体例(詳細)

Pathnameクラスが優れていることは以下の二つにあると思っています。

  • joinの引数に「スラッシュで始まる文字列」を指定した場合には、結果をルートからのパスとみなして返してくれる
  • パスの切れ目のスラッシュを適切に処理してくれる

具体例を見てみると、以下のようになります。場合分けをした上で、まとめて一つの例として書きました。

pwd = Pathname('/home/foobar')

puts pwd.join('hoge') #=> /home/foobar/hoge
puts pwd.join('/opt') #=> /opt
puts pwd.join('hoge').join('/opt') #=> /opt

puts pwd.join('hoge').join('fuga') #=> /home/foobar/hoge/fuga
puts pwd.join('hoge/').join('fuga') #=> /home/foobar/hoge/fuga
puts pwd.join('hoge').join('fuga/') #=> /home/foobar/hoge/fuga/
puts pwd.join('hoge/').join('fuga/') #=> /home/foobar/hoge/fuga/

上記のような挙動をしますので、様々な条件分岐から解放されます。

補足

join以外にもいくつかメソッドがあるので調べてみると面白いかと思います。

class Pathname (Ruby 3.1 リファレンスマニュアル)

*1:現在のディレクトリは Dir.pwd で取得してもよいです

Powered by はてなブログ