Ruby言語でクラスを使う10の方法! – Japanシーモア

Ruby言語でクラスを使う10の方法!

Ruby言語のクラスを使いこなす10の方法を学ぶRuby
この記事は約15分で読めます。

 

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

このサービスは複数のSSPによる協力の下、運営されています。

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

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

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

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

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

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

はじめに

プログラミング言語Rubyの一部として、”クラス”はその最も重要な概念の一つです。

しかし、初心者の中には、その使い方や活用法に迷ってしまう人も多いかもしれません。

この記事では、Rubyのクラスを使う方法を10のステップで解説します。

これを読めば、あなたもRubyのクラスを活用したプログラミングができるようになります。

●Rubyのクラスとは

Rubyのクラスは、オブジェクト指向プログラミングの中心的存在であり、データとそのデータを操作するためのメソッド(関数)をひとまとめにしたものを指します。

クラスを理解することで、より洗練されたコードを書くことができるようになります。

●Rubyクラスの作り方

クラスの作り方を掴むことから始めましょう。

それでは、基本的なクラスの定義について見ていきましょう。

○基本的なクラスの定義

Rubyでクラスを定義するためには、次のような書き方をします。

class クラス名
  # クラスの中身を定義する
end

このクラス名の部分には、あなたが作りたいクラスの名前を入れます。

そして、# クラスの中身を定義するの部分には、そのクラスが持つデータやメソッドを定義します。

○初めてのクラス作成:サンプルコード1

例えば、名前と年齢を持つPersonクラスを作る場合は、次のように書くことができます。

class Person
  def initialize(name, age)
    @name = name
    @age = age
  end

  def introduce
    puts "私の名前は#{@name}です。年齢は#{@age}歳です。"
  end
end

このコードではPersonというクラスを作成しています。

この例ではPersonクラスは@name@ageというデータ(属性)とintroduceというメソッドを持っています。

initializeは特殊なメソッドで、クラスのインスタンスが作られる時に自動的に実行されます。

このinitializeメソッドで@name@ageを初期化しています。

●クラスのメソッド

次に、クラスのメソッドについて詳しく見ていきましょう。

○メソッドの定義方法

Rubyのクラス内でメソッドを定義するためには、次のように書きます。

def メソッド名
  # メソッドの中身を定義する
end

このメソッド名の部分には、あなたが作りたいメソッドの名前を入れます。

そして、# メソッドの中身を定義するの部分には、そのメソッドが行う操作を定義します。

○メソッドを使う:サンプルコード2

例えば、上で定義したPersonクラスのintroduceメソッドを使って、自己紹介をするプログラムは以下のように書くことができます。

person = Person.new("田中", 30)
person.introduce

このコードでは、Personクラスのインスタンスを作成し、そのインスタンスのintroduceメソッドを呼び出しています。

この例では、”田中”という名前と30という年齢を持つPersonインスタンスを作成し、そのインスタンスが自己紹介をしています。

このコードを実行すると、「私の名前は田中です。年齢は30歳です。」と表示されます。

●クラスの属性

クラスの中に定義されるデータのことを属性と言います。

Rubyでは、クラスの中に定義される変数をインスタンス変数と呼び、このインスタンス変数がクラスの属性を形成します。

○属性の定義方法

Rubyのクラス内で属性を定義するためには、@記号をつけた変数を使います。

次のように定義します。

class クラス名
  def initialize
    @属性名 = 初期値
  end
end

この@属性名の部分には、あなたが作りたい属性の名前を入れます。

そして、初期値の部分には、その属性の初期値を設定します。

○属性を操作する: サンプルコード3

例えば、次のコードは名前(@name)と年齢(@age)という属性を持つPersonクラスを定義し、その属性を操作するメソッドを追加しています。

class Person
  def initialize(name, age)
    @name = name
    @age = age
  end

  def birthday
    @age += 1
  end
end

このコードでは、Personクラスにbirthdayというメソッドを追加し、それを呼び出すことで@age属性を1増やす(つまり、誕生日を迎える)ことができます。

これを利用して、誕生日を迎える処理を書くと次のようになります。

person = Person.new("田中", 30)
person.birthday

このコードを実行すると、”田中”さんの年齢が31に増えます。

●クラスの継承

クラスの継承は、既存のクラスの属性やメソッドを新しいクラスに引き継ぐ機能です。

これにより、既存のクラスをベースに新たな機能を持つクラスを効率よく作ることができます。

○継承の基本

Rubyでクラスを継承するためには、次のように記述します。

class 新クラス名 < 既存クラス名
  # 新クラスの中身を定義する
end

この新クラス名の部分には、新しく作りたいクラスの名前を、既存クラス名の部分には、既存のクラスの名前を入れます。

そして、# 新クラスの中身を定義するの部分には、新クラスに追加したいメソッドや属性を定義します。

○クラスの継承を試す:サンプルコード4

では、クラスの継承を利用したサンプルコードを見てみましょう。

class Person
  def initialize(name, age)
    @name = name
    @age = age
  end

  def introduce
    "私の名前は#{@name}です。年齢は#{@age}です。"
  end
end

class Employee < Person
  def initialize(name, age, occupation)
    super(name, age)
    @occupation = occupation
  end

  def introduce
    base_introduction = super
    "#{base_introduction} 職業は#{@occupation}です。"
  end
end

このコードでは、Personクラスを継承した新しいクラスEmployeeを作成しています。

Employeeクラスは、Personクラスの属性とメソッドを継承し、さらに新たな属性@occupationとメソッドintroduceを持っています。

継承元のPersonクラスのメソッドを利用するにはsuperを用い、新たな機能を追加することができます。

このコードを実行し、Employeeクラスのオブジェクトを生成して自己紹介をさせてみましょう。

employee = Employee.new("佐藤", 25, "エンジニア")
puts employee.introduce

このコードを実行すると、”私の名前は佐藤です。年齢は25です。職業はエンジニアです。”という出力が得られます。

こういった形で、Rubyでは継承を利用して既存のクラスをベースに新たな機能を持つクラスを効率よく作ることができます。

次に、Rubyのクラスにモジュールを取り入れて再利用性を高める方法について学んでいきましょう。

●クラスのモジュール化

Rubyのモジュールは、メソッドや定数をまとめたものであり、クラスと同様に名前空間を提供します。

クラスとの違いは、モジュールはインスタンス化できないという点と、モジュールは他のクラスやモジュールに取り込んで再利用することが可能な点です。

○モジュールの基本

Rubyでモジュールを定義するには、次のように記述します。

module モジュール名
  # モジュールの中身を定義する
end

このモジュール名の部分には、作りたいモジュールの名前を入れます。

そして、# モジュールの中身を定義するの部分には、モジュールに含めたいメソッドや定数を定義します。

モジュールの中に定義したメソッドや定数は、そのモジュールを取り込むクラスやモジュールから利用することができます。

では、具体的なコードを見てみましょう。

○モジュールを使う:サンプルコード5

では、具体的なモジュールの作成と利用を見ていきましょう。

module Greeting
  def hello
    "こんにちは"
  end
end

class Person
  include Greeting

  def initialize(name)
    @name = name
  end

  def greet
    "#{@name}さん、#{hello}"
  end
end

このコードではGreetingというモジュールを作成し、その中にhelloというメソッドを定義しています。

そしてPersonというクラスでそのモジュールを取り込むことで、Personクラスの中からhelloメソッドを利用できるようにしています。

モジュールをクラスに取り込むためにはincludeキーワードを使用します。

これにより、モジュールの中に定義したメソッドを、クラスのインスタンスメソッドとして使用することができます。

このコードのPersonクラスのオブジェクトを作成して、挨拶をさせてみましょう。

person = Person.new("田中")
puts person.greet

このコードを実行すると、”田中さん、こんにちは”という出力が得られます。

こういった形で、モジュールはコードの再利用性を高め、同じ機能を必要とする複数のクラスに対して共通の動作を提供することができます。

●Rubyクラスの応用例

クラスは、実世界の事物や概念をコードの中で表現するための仕組みです。

それゆえ、クラスを使ったプログラムは非常に多岐にわたります。

オブジェクト指向プログラミング、データ処理、Webアプリケーションの作成、データベースの操作、テストの自動化など、様々な応用例を紹介していきます。

○オブジェクト指向プログラミング:サンプルコード6

まずはオブジェクト指向プログラミングの基本を見ていきましょう。

Rubyは純粋なオブジェクト指向言語であり、Rubyでプログラムを書くときは全てがオブジェクトとして扱われます。

オブジェクト指向プログラミングでは、オブジェクトとその振る舞いを定義するクラスを使ってコードを構造化します。

車を表すクラスとその使用例を紹介します。

class Car
  def initialize(brand, model)
    @brand = brand
    @model = model
  end

  def honk
    "ホンク! #{@brand} #{@model}が通ります!"
  end
end

my_car = Car.new('トヨタ', 'カローラ')
puts my_car.honk

このコードでは、Carというクラスを定義し、その中にinitializeメソッドとhonkメソッドを定義しています。

そして、Carクラスのオブジェクトを生成し、そのオブジェクトを使ってhonkメソッドを呼び出しています。

この例では、オブジェクト指向プログラミングの主要な特徴、すなわちデータとそのデータに対する操作を同じクラスの中にまとめることで、コードの理解と管理を容易にしています。

クラスの中のinitializeメソッドは、オブジェクトが生成されるときに実行される特別なメソッドで、オブジェクトの初期状態を設定します。

このメソッドで設定したデータは、オブジェクト内で共有され、他のメソッドからアクセスすることが可能です。

このコードを実行すると、「ホンク! トヨタ カローラが通ります!」と表示されます。

次に、Rubyクラスを利用したデータ処理の具体例を見ていきましょう。

○データ処理:サンプルコード7

Rubyのクラスは、複雑なデータ処理を行うための強力なツールでもあります。

データの入力、変換、出力など、さまざまな作業を独自のメソッドとしてクラスに定義できます。

単純なデータ処理を行うためのクラスを定義した例を紹介します。

class DataProcessor
  def initialize(data)
    @data = data
  end



 def process
    @data.map { |item| item * 2 }
  end
end

processor = DataProcessor.new([1, 2, 3, 4, 5])
puts processor.process

このコードでは、DataProcessorクラスを作成し、その中にinitializeメソッドとprocessメソッドを定義しています。

そして、DataProcessorのオブジェクトを生成し、そのオブジェクトのprocessメソッドを呼び出しています。

このprocessメソッドは、入力された配列の各要素を2倍にして新しい配列を作成します。

つまり、このクラスは入力データを特定の方法で処理する機能を提供します。

このコードを実行すると、「2, 4, 6, 8, 10」と表示されます。

○Webアプリケーション:サンプルコード8

次に、WebアプリケーションにおけるRubyのクラスの活用について見ていきましょう。

Rubyを使ったWeb開発には多くのフレームワークが存在しますが、その中でも代表的なものがRuby on Railsです。

Ruby on Railsは、Webアプリケーションの開発を効率化するためのフレームワークであり、その中心的な概念がクラスです。

Ruby on Railsでのコントローラーは、通常クラスとして定義され、Webアプリケーションの特定の部分を制御します。

単純なコントローラークラスの例を紹介します。

class WelcomeController < ApplicationController
  def index
    @message = "こんにちは、Ruby on Rails!"
  end
end

このコードでは、WelcomeControllerというクラスを作成しています。

このクラスは、ApplicationControllerを継承しており、これによりRailsの基本的なコントローラー機能が利用できます。

indexメソッドは、特定のURLにアクセスした際に実行されるアクションを表現しています。

このメソッドはインスタンス変数@messageに文字列をセットします。この変数は、関連するビュー内で利用できます。

このコードを実行した際、ユーザーがWelcomeControllerのindexアクションにアクセスすると、「こんにちは、Ruby on Rails!」というメッセージが表示されます。

これはRubyのクラスがWebアプリケーション内でどのように働くかを示す基本的な例です。

Rubyのクラスは、様々なWebアプリケーションのコンポーネントを定義し、コントロールするために利用されます。

○データベース操作:サンプルコード9

Rubyのクラスはデータベースの操作にも利用されます。

特にRuby on Railsでは、ActiveRecordというライブラリが提供されており、これを用いてデータベースとのやりとりを抽象化した形で書くことができます。

class User < ActiveRecord::Base
  def full_name
    "#{first_name} #{last_name}"
  end
end

user = User.find(1)
puts user.full_name

このコードでは、Userクラスを定義し、その中にfull_nameメソッドを定義しています。

このメソッドは、ユーザーの名前を結合してフルネームを返す機能を提供します。

User.find(1)でデータベースからidが1のユーザーを取得し、そのユーザーのフルネームを表示します。

このコードを実行すると、データベースから取得したユーザーのフルネームが表示されます。

○テスト自動化:サンプルコード10

プログラミングにおいて、特に重要なのがテストの自動化です。

テストを自動化することで、新たな機能の追加や既存の機能の修正が、予期せぬバグを引き起こしていないかを効率的に検証することが可能となります。

Rubyでは、RSpecというテストフレームワークがよく利用されています。

RSpecは、Rubyのクラスとメソッドに対して行いたいテストを記述することができます。

次のコードは、先ほど紹介したUserクラスに対するテストの例です。

require 'rspec'
require_relative 'user'

RSpec.describe User, "#full_name" do
  it "returns the full name of the user" do
    user = User.new(first_name: 'Taro', last_name: 'Yamada')
    expect(user.full_name).to eq 'Taro Yamada'
  end
end

このコードでは、Userクラスのfull_nameメソッドが正しく動作するかを検証しています。

RSpec.describe User, "#full_name"Userクラスのfull_nameメソッドに対するテストを宣言しています。itメソッドは、テストの具体的な内容を記述します。

このテストを実行すると、Userクラスのfull_nameメソッドが、期待通りに名前と姓を結合して返すことを確認できます。

●Rubyクラスの注意点と対処法

Rubyのクラスを使用する際には、いくつか注意すべき点があります。

一つは、クラス変数の扱いです。クラス変数は、そのクラス及び継承したすべてのクラスから参照できる変数です。

しかし、その特性上、予期せぬ挙動を引き起こすことがあります。

特に継承関係にある複数のクラスでクラス変数を利用すると、意図せぬ値の変更が起こる可能性があります。

そのため、クラス変数の代わりにクラスインスタンス変数を使用することを推奨します。

また、Rubyのクラスは開放的な特性を持っています。つまり、既存のクラスに対して新たなメソッドを追加することが可能です。

これにより、プログラムの挙動を柔軟に変更することが可能となりますが、同時に予期せぬ挙動の原因ともなります。

そのため、この特性は必要な場合にのみ慎重に使用するべきです。

まとめ

以上がRuby言語でクラスを使う10の方法の説明でした。

これらの手法を駆使することで、Rubyのプログラミングがより効率的かつ効果的になることでしょう。

この記事を通じて、Ruby言語でのクラスの活用方法を理解し、実践できるようになれば幸いです。