Ruby初心者必見!compactメソッドの使い方と活用例10選

Rubyのcompactメソッドに関する詳細な解説と使用例Ruby
この記事は約13分で読めます。

 

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

基本的な知識があればカスタムコードを使って機能追加、目的を達成できるように作ってあります。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を凌駕する現役のプログラマチームによって監修されています。

サイト内のコードを共有する場合は、参照元として引用して下さいますと幸いです

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

この記事を通して、Ruby初心者でもcompactメソッドの基本的な使い方や、具体的な応用例を学ぶことができます。

さらに注意点やカスタマイズ方法も含め、compactメソッドを使いこなすための情報を提供します。

●Rubyとcompactメソッドの基本

Rubyとは、とても人間に近い表現力を持ったプログラミング言語です。

その中で「compactメソッド」は、データからnil(何もないことを表す値)を取り除くメソッドです。

この方法を学ぶことで、データの前処理を効率化したり、プログラムの品質を向上させることが可能になります。

●compactメソッドの使い方

compactメソッドは、Rubyにおける配列やハッシュの操作に頻出するメソッドの一つです。

基本的な使い方や、その使用例をいくつか見てみましょう。

○基本的な使い方

compactメソッドは、配列やハッシュからnilの要素を取り除くメソッドです。

使用方法は、配列やハッシュに対して”.compact”というメソッドを呼び出すだけです。

array = [1, nil, 2, nil, 3]
array.compact
# => [1, 2, 3]

このコードでは、1, nil, 2, nil, 3の5つの要素を持つ配列を作成し、その配列に対してcompactメソッドを実行しています。

実行結果として、nilの要素が取り除かれ、1, 2, 3の3つの要素のみを持つ新しい配列が得られます。

○サンプルコード1:配列からnilを取り除く

では、配列に含まれるnilを取り除く具体的なコードを見てみましょう。

numbers = [1, nil, 2, nil, 3, nil, 4, nil, 5]
clean_numbers = numbers.compact
puts clean_numbers
# => [1, 2, 3, 4, 5]

このコードでは、1から5までの数字とnilが交互に入った配列を作成し、その配列に対してcompactメソッドを適用しています。

実行結果として、nilの要素が取り除かれ、1から5までの数字だけが入った新しい配列が得られます。

○サンプルコード2:ハッシュからnilを取り除く

compactメソッドはハッシュにも適用することができます。

次に、ハッシュに含まれるnilを取り除くコードを見てみましょう。

data = { a: 1, b: nil, c: 2, d: nil, e: 3 }
clean_data = data.compact
puts clean_data
# => {:a=>1, :c=>2, :e=>3}

このコードでは、:a, :b, :c, :d, :eという5つのキーを持つハッシュを作成し、そのハッシュに対してcompactメソッドを実行しています。

実行結果として、nilの値を持つキー: bとキー: dが取り除かれ、:a=>1, :c=>2, :e=>3の3つのキーと値のペアを持つ新しいハッシュが得られます。

●compactメソッドの応用例

compactメソッドの基本的な使い方について理解したところで、次に具体的な応用例を見ていきましょう。

これから提示する各サンプルコードが、Ruby初心者のあなたがcompactメソッドをより深く理解し、日々のコーディングに活かす一助となれば幸いです。

○サンプルコード3:nilを含む配列を使った計算

compactメソッドを使うことで、nilを含む配列を使った計算もスムーズに行えます。

下記のコードでは、nilを含む配列の数値の合計を計算しています。

numbers = [1, nil, 2, nil, 3, nil, 4, nil, 5]
total = numbers.compact.sum
puts total
# => 15

このコードでは、compactメソッドでnilを取り除いた後に、sumメソッドを使って数値の合計を求めています。

こうすることで、エラーを起こすことなくnilを含む配列の数値の合計を計算することができます。

○サンプルコード4:nilを含むハッシュを使ったデータ操作

次に、nilを含むハッシュに対するデータ操作の例を見てみましょう。

data = { a: 1, b: nil, c: 2, d: nil, e: 3 }
clean_data = data.compact
keys = clean_data.keys
puts keys
# => [:a, :c, :e]

このコードでは、compactメソッドでnilを含むハッシュからnilの値を持つキーと値のペアを取り除き、その後でkeysメソッドを使用して残ったキーのリストを取得しています。

これにより、nilを含むハッシュを操作する際にエラーを避けることができます。

○サンプルコード5:compactと他のメソッドの連携

compactメソッドは他のメソッドと組み合わせることで、より強力な機能を発揮します。

下記のコードでは、compactメソッドとmapメソッドを組み合わせています。

numbers = [1, nil, 2, nil, 3, nil, 4, nil, 5]
doubled_numbers = numbers.compact.map {|n| n * 2}
puts doubled_numbers
# => [2, 4, 6, 8, 10]

このコードでは、compactメソッドでnilを取り除いた後に、mapメソッドを使って各数値を2倍にしています。

compactメソッドを使うことで、nilを気にすることなく配列の操作を行うことができます。

○サンプルコード6:大規模データの前処理に使う

大規模なデータの前処理にcompactメソッドを活用することもできます。

下記のコードでは、CSVファイルを読み込み、各行に対してcompactメソッドを適用し、nilを除去した後に再度CSVファイルとして出力します。

require 'csv'

original_data = CSV.read('input.csv')
cleaned_data = original_data.map(&:compact)

CSV.open('output.csv', 'w') do |csv|
  cleaned_data.each do |data|
    csv << data
  end
end

このコードでは、Rubyの標準ライブラリの一つであるCSVを使ってCSVファイルを操作しています。

readメソッドでCSVファイルを読み込み、そのデータをmapメソッドとcompactメソッドを用いてnilを取り除き、それを新しいCSVファイルとして出力しています。

これにより、大量のデータに対して一度にcompactメソッドを適用することが可能となります。

○サンプルコード7:ユーザー入力値のバリデーションに使用する

compactメソッドは、ユーザーからの入力値のバリデーション(検証)にも活用できます。

例えば、ユーザーが複数の入力フィールドにデータを入力する場合、全てのフィールドが必須でない場合には、未入力のフィールドはnilとして扱われます。

これらのnilを取り除くためにcompactメソッドを用いることができます。

user_input = { name: 'Alice', age: nil, email: 'alice@example.com' }
validated_input = user_input.compact

puts validated_input
# => { name: 'Alice', email: 'alice@example.com' }

このコードでは、ユーザー入力値がハッシュ形式で格納されていると仮定し、compactメソッドを用いてnilの値を持つキーを取り除いています。

これにより、未入力のフィールドを無視したデータ操作を行うことができます。

○サンプルコード8:APIレスポンスのパースに使用する

APIから取得したレスポンスを扱う際、compactメソッドは非常に便利です。

APIからのレスポンスに含まれるデータには、場合によりnilが含まれることがあります。

そのような場合に、compactメソッドを用いてnilを除去することができます。

require 'json'
require 'net/http'
require 'uri'

uri = URI.parse('https://api.example.com/data')
response = Net::HTTP.get_response(uri)
parsed_data = JSON.parse(response.body)

cleaned_data = parsed_data.compact

このコードでは、まずRubyの標準ライブラリであるjson、net/http、uriを使用します。

uriライブラリを用いてAPIのURLをURIオブジェクトに変換し、それをnet/httpライブラリのget_responseメソッドに渡すことでAPIからのレスポンスを取得します。

取得したレスポンスをjsonライブラリのparseメソッドでパース(解析)し、Rubyのデータ構造に変換します。

最後にcompactメソッドを使ってnilを取り除いています。

○サンプルコード9:データマイニングに使用する

データマイニングの過程では、大量のデータを処理することが一般的であり、その中には値が存在しない(nil)データも含まれることがあります。

compactメソッドはこのような場合に非常に役立ちます。

data = [
  { name: 'Alice', age: 20, occupation: nil },
  { name: 'Bob', age: nil, occupation: 'Engineer' },
  { name: 'Charlie', age: 30, occupation: 'Doctor' },
]

cleaned_data = data.map(&:compact)

このコードでは、ハッシュの配列を扱っています。

各ハッシュには’name’, ‘age’, ‘occupation’のキーがありますが、中にはnilを値に持つキーも存在します。

mapメソッドとcompactメソッドを使用して、各ハッシュからnilの値を持つキーを除去しています。

この結果、データ分析を行う際に無関係なnil値が混在しないデータセットを手に入れることができます。

○サンプルコード10:Webスクレイピングで取得したデータのクリーニングに使用する

Webスクレイピングで取得したデータには、しばしばnilが含まれます。

compactメソッドを使用することで、これらのnil値を取り除き、データクリーニングを効率的に行うことができます。

scraped_data = ['Ruby', nil, 'Python', 'Java', nil, 'JavaScript']
cleaned_data = scraped_data.compact

このコードでは、Webスクレイピングで取得した可能性のあるデータを模擬的に示しています。

このデータからnilを取り除くために、compactメソッドを使用しています。

これにより、データ分析やデータ処理を行う際に、無関係なnil値が混在しないクリーンなデータセットを作成することができます。

●注意点と対処法

Rubyのcompactメソッドは便利な反面、注意すべき点が存在します。

その一つはcompactメソッドは元の配列を変更しないことです。

つまり、compactメソッドを実行しただけでは、元の配列からnilを取り除くことはできません。

data = [1, 2, nil, 3, nil, 4]
data.compact
puts data
# => [1, 2, nil, 3, nil, 4]

このコードでは、compactメソッドを適用しても、元の配列dataが変更されないことを表しています。

compactメソッドを実行した後も、元の配列dataには依然としてnilが含まれています。

○compactメソッドの落とし穴

上記の事例は、compactメソッドの一つの「落とし穴」とも言えます。

nilを持つ元の配列からnilを取り除いた新しい配列を得ることは可能ですが、compactメソッドを用いても元の配列自体が変更されるわけではないのです。

○対処法とは

しかし、これには対処法があります。

それが「破壊的メソッド」のcompact!メソッドを使用することです。

このメソッドを使うと、元の配列自体からnilが取り除かれます。

data = [1, 2, nil, 3, nil, 4]
data.compact!
puts data
# => [1, 2, 3, 4]

このコードでは、compact!メソッドを使って元の配列から直接nilを取り除いています。

結果として出力される配列にはnilが含まれておらず、元の配列自体が変更されています。

これらの知識を持つことで、compactメソッドをより効果的に使いこなすことが可能になります。

また、compactメソッドの挙動を理解することは、Rubyの配列操作についての理解を深めることにも繋がります。

●カスタマイズ方法

Rubyのcompactメソッドはそのままでも非常に便利ですが、更にカスタマイズすることも可能です。

例えば、nilだけでなく、特定の値を除外する新たなメソッドを作ることも可能です。

これにはRubyのオープンクラスという機能を利用します。

オープンクラスを使うと、既存のクラスに新たなメソッドを追加したり、既存のメソッドを上書きしたりすることができます。

○compactメソッドの拡張

例えば、次のようにArrayクラスに新たなメソッドを追加し、compactメソッドを拡張することができます。

ここでは新たにcompact_withメソッドを追加し、引数で指定した値を除外する機能を実装しています。

class Array
  def compact_with(value)
    self.reject { |item| item == value }
  end
end

data = [1, 2, 'sample', 3, 'sample', 4]
data = data.compact_with('sample')
puts data
# => [1, 2, 3, 4]

このコードでは、まずArrayクラスに新たなメソッドcompact_withを定義しています。

このメソッドは、配列から指定した値を除外するという挙動を持ちます。

次に、’sample’という文字列を含む配列から’sample’を除外するという操作を実行しています。

結果として出力される配列には、’sample’という文字列が含まれていません。

このように、Rubyのcompactメソッドは基本的な使い方だけでなく、カスタマイズにより更に便利に使うことができます。

この記事で紹介したテクニックを活用し、Rubyでのプログラミングをより効率的に、そして楽しく行ってみてください。

まとめ

この記事では、Rubyのcompactメソッドについて詳しく解説しました。

まず基本的な使い方から始め、様々な応用例を示しました。

特に配列からnilを取り除く際に役立つcompactメソッドは、Rubyを使ったプログラミングで頻繁に出てくる操作です。

初心者にとっては欠かせない知識と言えるでしょう。

また、compactメソッドの落とし穴とその対処法についても解説しました。

具体的には、元の配列自体を変更しないという点や、新たな配列を返すという挙動などです。

これらは意識して使わなければならない注意点です。

さらに、compactメソッドを自分のニーズに合わせてカスタマイズする方法も紹介しました。

Rubyのオープンクラスの機能を使って、既存のcompactメソッドを上書きする形で新たなメソッドを定義しました。

これにより、nilだけでなく特定の値を除外する新たなメソッドを実装できます。

Ruby初心者の方は、compactメソッドの基本的な使い方から応用例、カスタマイズ方法まで、この記事を参考に一通り学ぶことができるでしょう。

そして、この知識を活かしてRubyプログラミングをより効率的に、そして楽しく行うことができるはずです。

皆さんのRuby学習が一歩進むことを願っています。