標準ライブラリ【パーフェクトRuby Part4】


関東の大雪でめっちゃ寒いですが、『パーフェクト Ruby』を少しずつですが読み進めています。ここでは『Part3のメタプログラミング』に引き続いて、Part4の標準ライブラリで特に気になった部分をメモしていきます!


😼 ファイルパスを表現するクラス: Pathname

ファイルパスを表現するクラス「Pathname」はファイルパスをオブジェクト指向らしく扱うことができるクラスです。

require 'pathname'

home = Pathname.new('~')

foo = home.join('foo.txt')

p foo #=> #
p foo.dirname #=> #
p foo.basename #=> #
p foo.expand_path #=> #
p foo.expand_path.parent #=> #
p foo.expand_path.parent.parent #=> #

このほかにもファイルの属性などを簡単に習得することもできます。詳しくはこちらの「リファレンス」を

🍮 ファイル操作: FileUtils

FileUtils」はファイル操作を行ための処理を集めたモジュールです。

require 'fileutils'

# ディレクトリ内のファイルを別のディレクトリにコピー
FileUtils.cp_r 'from/dir', 'to/dir'

# ファイル所有者変更
FileUtils.crown_R 'user_name', 'group_name', 'dir'

# ディレクトリの作成
FileUtils.mkdir_p 'hoge/huga/foo'

# ハードリンクの作成
FileUtils.ln 'source', 'destination'

# シンボリックリンクの作成
FileUtils.ln_s 'source', 'destination'

🐞 一時作業ディレクトリ: tmpdir

複数のファイルを順次作成して全てそろってから結合作業を行う場合などは、一時的な作業ディレクトリが必要になることがあります。そんなときに「tmpdirライブラリ」が役に立ちます。

require 'tmpdir'

path = Dir.mktmpdir('prefix')
puts path #=> /var/folders/yd/z2mfpb7n4g98gmcbtxn17wnr0000gn/T/prefix20140209-16518-1kzz0zb

puts File.directory?(path) #=> 1

🎂 一時ファイル: tmpfile

アップロードされたファイルの内容を一時的にファイルに書き込んでそれを元に操作を行うような場合、一時ファイルを必要とすることがあります。そのときにこの『**tmpfileライブラリ』が役に立ちます。

require 'tempfile'
path = Tempfile.open(['hoge', 'bar']) do |f|
f.puts 'foobar'
f.path
end

puts path #=> /var/folders/yd/z2mfpb7n4g98gmcbtxn17wnr0000gn/T/hoge20140209-17075-1t7lsy2bar
puts File.read(path) #=> foobar

👽 Timeクラスの拡張: time

Rubyの組込みラスのTimeを拡張する標準ライブラリとして「time」があります。

require 'time'

# Time#parseはTimeオブジェクトを返す
puts Time.parse('2011-04-01 16:01').class #=> time

puts Time.parse('Sun, 29 Jan 2012 14:14:09 +0900') #=> 2012-01-29 14:14:09 +0900

puts Time.parse('2013012914144909') #=> 2013-01-29 09:14:49 +0900

###############################
time = Time.parse('2011-04-01 16:01')

# 各種フォーマットに対応した文字列を返す
puts time.iso8601 #=> 2011-04-01T16:01:00+09:00
puts time.httpdate #=> Fri, 01 Apr 2011 07:01:00 GMT
puts time.rfc2822 #=> Fri, 01 Apr 2011 16:01:00 +0900

# 様々なフォーマットの文字列をパースする
puts Time.iso8601('2011-04-01T16:01:00+09:00') #=> 2011-04-01 07:01:00 UTC
puts Time.httpdate('Fri, 01 Apr 2011 07:01:00 GMT') #=> 2011-04-01 16:01:00 +0900

🐰 日付を表現: Dateクラス

日付を表現するDateクラスは日付計算をかなり便利にやってくれます。

require 'date'

# 年月日から日付オブジェクトを取得
date = Date.new(2011, 4, 1)
#=> #

# 曜日(番号)を取得
date.wday #=> 5

# 日付 => 指定したフォーマットの文字列に変換
date.strftime('%Y/%m/%d %H:%M:%S') #=> "2014/02/16 00:00:00"

# 現在の日時オブジェクトを取得
date = Date.today #=> #

# n日後
date.next_day(3) #=> #

# n日前
date.prev_day(3) #=> #

# nヶ月後
date.next_month(2) #=> #

# n年前
date.prev_year(3) #=> #

🚌 日付と時刻を表現: DateTimeクラス

Dateクラスを継承して、時刻情報も扱うことができるDateTimeクラスを紹介します。

require 'date'

# 年月日時分秒からDateTimeオブジェクトを取得
date = DateTime.new(2011, 4, 1, 4, 4, 25)
#=> #

# 様々な書式で出力
date.httpdate #=> "Fri, 01 Apr 2011 04:04:25 GMT"
date.iso8601 #=> "2011-04-01T04:04:25+00:00"

# 様々な書式をパースする
DateTime.httpdate('Tue, 3 Jul 2012 12:08:43 GMT')
#=> #
DateTime.rfc3339('2012-07-03T22:09:44+09:00')
#=> #

🐝 ベンチマークを簡単に測定できる: benchmark

Rubyでプログラムの実行時間を計測するためのライブラリがbenchmarkです。

require 'benchmark'

n = 10000000

Benchmark.bm(7, '>total:', '>avg:') do |x|
f = x.report('for:') { for i in 1..n; val = 'value' end }
w = x.report('while:') { i = 1; while i <= n; val="value" ; i +="1" end }< span>
t = x.report('times:') { n.times do val = 'value' end }

total = f + w + t
average = total / 3

[total, average]
end

このプログラムの実行結果がこちら。

              user     system      total        real
for:      1.070000   0.010000   1.080000 (  1.072397)
while:    0.690000   0.000000   0.690000 (  0.695177)
times:    1.070000   0.000000   1.070000 (  1.064100)
>total:   2.830000   0.010000   2.840000 (  2.831674)
>avg:     0.943333   0.003333   0.946667 (  0.943891)

🖥 VULTRおすすめ

VULTR」はVPSサーバのサービスです。日本にリージョンがあり、最安は512MBで2.5ドル/月($0.004/時間)で借りることができます。4GBメモリでも月20ドルです。 最近はVULTRのヘビーユーザーになので、「ここ」から会員登録してもらえるとサービス開発が捗ります!

📚 おすすめの書籍