Zenn
💎

Rubyの便利なメソッド 応用できる30個

2025/03/24に公開

はじめに

前回の記事では、Rubyの基本的かつ便利なメソッドを20個紹介しました。今回は、より実践的な場面で活躍する30個のメソッドを紹介します。これらを習得することで、より効率的で堅牢なRubyプログラミングが可能になります。それぞれのメソッドについて、具体的な使用例と共に解説していきます。
※前回の記事は以下になります。
https://zenn.dev/osakayakyu/articles/643ef405c61b2b

📁 ファイル操作

1. File.open

ファイルを開いて読み書きするための基本メソッド。ブロックを使用するとファイルのクローズが自動的に行われます。

File.open('example.txt', 'w') do |file| 
  file.puts 'Hello, Ruby!'
end

2. File.read

ファイルの内容を一度に読み込みます。小さなファイルを素早く処理するのに最適です。

content = File.read('example.txt')
puts content  # => "Hello, Ruby!"

3. File.exist?

指定したファイルが存在するかを確認します。ファイル操作前の安全チェックに便利です。

if File.exist?('example.txt')
  puts "ファイルが存在します"
else
  puts "ファイルが見つかりません"
end

4. File.delete

ファイルを削除します。存在チェックと組み合わせて使うと安全です。

File.delete('example.txt') if File.exist?('example.txt')

5. Dir.glob

指定したパターンに一致するファイルの一覧を取得します。ワイルドカードを使った検索が可能です。

ruby_files = Dir.glob('*.rb')  # 現在のディレクトリの全.rbファイルを取得
puts ruby_files.inspect

⏰ 日付と時間

6. Time.now

現在の日時を取得します。タイムスタンプの記録などに利用できます。

current_time = Time.now
puts current_time  # => 2025-03-24 10:00:00 +0900

7. Time.parse

文字列から日時オブジェクトを生成します。外部データの日時情報を扱う際に便利です。

require 'time'
time = Time.parse('2025-03-24 10:00:00')
puts time

8. strftime

日時を指定したフォーマットの文字列に変換します。ログやユーザー表示用の整形に役立ちます。

formatted_time = Time.now.strftime('%Y-%m-%d %H:%M:%S')
puts formatted_time  # => "2025-03-24 10:00:00"

9. + / - 演算子

日時に対して秒数を加減算できます。期限や予定日の計算に便利です。

one_hour_later = Time.now + 3600  # 1時間後の時刻
one_day_ago = Time.now - 86400    # 1日前の時刻

10. to_date (Date クラス)

Time オブジェクトから日付のみの情報を取得します。日付のみの比較や計算に使えます。

require 'date'
today = Date.today
puts today  # => 2025-03-24

⚙️ エラーハンドリング

11. begin-rescue

例外が発生する可能性のあるコードを安全に実行するための基本構文です。

begin
  result = 1 / 0  # ゼロ除算エラーが発生
rescue ZeroDivisionError => e
  puts "エラーが発生しました: #{e.message}"
end

12. raise

明示的に例外を発生させます。独自のエラーチェックで条件を満たさない場合などに使用します。

def divide(a, b)
  raise ArgumentError, '0で割ることはできません' if b == 0
  a / b
end

13. ensure

例外の有無にかかわらず実行される処理を定義します。リソースの解放などに使用します。

begin
  file = File.open('example.txt', 'r')
  content = file.read
rescue Errno::ENOENT => e
  puts "ファイルが見つかりません: #{e.message}"
ensure
  file&.close  # ファイルが開かれていれば必ず閉じる
end

14. retry

例外発生後に処理を再試行します。一時的な障害のリトライに便利です。

attempts = 0
begin
  attempts += 1
  puts "試行回数: #{attempts}"
  raise 'エラー発生' if attempts < 3
rescue
  puts "リトライします"
  retry if attempts < 3
end

15. catch / throw

特定のポイントまでプログラムの実行を即座に移動させます。深いネストからの脱出に便利です。

catch(:done) do
  10.times do |i|
    puts i
    throw :done if i == 5  # i が 5 になったらループを終了
  end
  puts "この行は実行されません"
end
puts "catch-throw 完了"

🔢 数値計算

16. Math.sqrt

平方根を計算します。数学的な計算やグラフィックス処理に使用します。

puts Math.sqrt(16)  # => 4.0
puts Math.sqrt(2)   # => 1.4142135623730951

17. Math.log

自然対数を計算します。科学計算や特定のアルゴリズムに使います。

puts Math.log(10)    # => 2.302585092994046
puts Math.log10(100) # => 2.0(底が10の対数)

18. rand

乱数を生成します。テストデータの作成やゲーム開発に役立ちます。

puts rand(1..10)    # => 1から10のランダムな整数
puts rand           # => 0.0から1.0未満のランダムな浮動小数点数

19. max / min

配列内の最大値・最小値を取得します。データの範囲を把握するのに役立ちます。

numbers = [1, 2, 3, 4, 5]
puts numbers.max  # => 5
puts numbers.min  # => 1
puts [3, 1, 4, 1, 5, 9, 2].minmax.inspect  # => [1, 9]

20. sum

配列の要素の合計を計算します。数値以外の配列でも初期値を指定することで使用可能です。

puts [1, 2, 3, 4, 5].sum  # => 15
puts ['a', 'b', 'c'].sum('')  # => "abc"

🛠 その他便利メソッド

21. tap

オブジェクトをブロックに渡し、そのオブジェクト自身を返します。デバッグや連鎖的な処理に便利です。

result = (1..10).tap { |x| puts "処理前のオブジェクト: #{x.inspect}" }
                .select(&:even?)
                .tap { |x| puts "select後のオブジェクト: #{x.inspect}" }
                .map { |x| x * 2 }
puts "最終結果: #{result.inspect}"

22. dig

ネストした構造からsafe navigation演算子のように安全に値を取得します。

data = { user: { profile: { name: 'Alice' } } }
puts data.dig(:user, :profile, :name)  # => 'Alice'
puts data.dig(:user, :settings, :theme)  # => nil(エラーにならない)

23. each_with_index

配列の各要素とそのインデックスを同時に処理します。位置情報が必要な場合に便利です。

%w[a b c].each_with_index do |val, index|
  puts "#{index}: #{val}"
end
# 出力:
# 0: a
# 1: b
# 2: c

24. partition

条件に基づいて配列を2つのグループに分けます。データのフィルタリングに便利です。

evens, odds = [1, 2, 3, 4, 5].partition(&:even?)
puts "偶数: #{evens.inspect}"  # => [2, 4]
puts "奇数: #{odds.inspect}"   # => [1, 3, 5]

25. zip

複数の配列を結合して、対応する要素の配列を作成します。複数のデータシリーズの処理に便利です。

names = ['Alice', 'Bob', 'Charlie']
ages = [20, 25, 30]
combined = names.zip(ages)
puts combined.inspect  # => [["Alice", 20], ["Bob", 25], ["Charlie", 30]]

# Hash に変換する例
puts Hash[combined].inspect  # => {"Alice"=>20, "Bob"=>25, "Charlie"=>30}

26. reduce (inject)

配列の要素を集約して1つの結果を生成します。合計、最大値の計算など様々な用途に使えます。

sum = [1, 2, 3, 4].reduce(:+)
puts sum  # => 10

product = [1, 2, 3, 4].reduce(1, :*)
puts product  # => 24

sentence = ['Ruby', 'is', 'fun'].reduce('') { |result, word| result + ' ' + word }.strip
puts sentence  # => "Ruby is fun"

27. object_id

オブジェクトの一意な識別子を取得します。オブジェクトの同一性確認に使用できます。

str1 = 'Hello'
str2 = 'Hello'
str3 = str1

puts str1.object_id  # 一意のID
puts str2.object_id  # 異なるID
puts str3.object_id  # str1と同じID

28. clone / dup

オブジェクトの複製を作成します。破壊的変更を避けたい場合に便利です。

original = 'Ruby'
copy = original.clone
copy.upcase!

puts original  # => "Ruby"(元のオブジェクトは変更されない)
puts copy      # => "RUBY"

29. singleton_class

オブジェクト固有のメソッドを定義するためのクラスにアクセスします。メタプログラミングに使用します。

obj = Object.new

class << obj
  def custom_method
    'Hello from singleton method!'
  end
end

puts obj.custom_method  # => 'Hello from singleton method!'

30. define_method

動的にメソッドを定義します。コードの生成や反復的なメソッド定義の簡略化に便利です。

class Example
  ['hello', 'goodbye', 'thanks'].each do |greeting|
    define_method("say_#{greeting}") do |name|
      "#{greeting.capitalize}, #{name}!"
    end
  end
end

example = Example.new
puts example.say_hello('Ruby')     # => "Hello, Ruby!"
puts example.say_goodbye('World')  # => "Goodbye, World!"

まとめと次のステップ

これで、Rubyの便利なメソッド50個(前回の20個と今回の30個)をマスターしました!これらのメソッドを使いこなすことで、より簡潔で読みやすいコードが書けるようになります。

実践的な応用例

これらのメソッドを組み合わせた実践的な例を紹介します:

# CSVファイルの処理と分析
require 'csv'

# CSVファイルからデータを読み込み、加工して出力する例
def process_data(filename)
  begin
    # ファイルの存在確認
    raise "ファイルが見つかりません: #{filename}" unless File.exist?(filename)
    
    # データ読み込み
    data = CSV.read(filename, headers: true)
    
    # 年齢でグループ分け
    groups = data.map { |row| row.to_h }.partition { |person| person['age'].to_i >= 30 }
    
    # 結果出力
    {
      over_30: groups[0],
      under_30: groups[1],
      average_age: data.map { |row| row['age'].to_i }.sum / data.size.to_f
    }
  rescue => e
    puts "エラーが発生しました: #{e.message}"
    {}
  end
end

次のステップとして

  1. Rubyの標準ライブラリを探索する: JSON, CSV, Net::HTTP など、多くの便利なライブラリがあります。
  2. メタプログラミング技術を深める: method_missing, instance_eval などの高度なテクニックを学びましょう。
  3. 実際のプロジェクトに適用する: 学んだメソッドを使って、小さなツールやWebアプリケーションを作成してみましょう。
  4. テストを書く: RSpecやMinitestを使って、コードの品質を保証する習慣をつけましょう。

ぜひこれらのメソッドを日々のコーディングに取り入れて、Rubyならではの簡潔で表現力豊かなコードを書いていきましょう!

Discussion

ログインするとコメントできます