Rubyで引数の型チェックをする方法を現役エンジニアが解説【初心者向け】

初心者向けにRubyで引数の型チェックをする方法について現役エンジニアが解説しています。変数や引数が文字列なのか数値なのかデータ型を判別するには、クラスを判定するメソッドを使います。値はIntegerやNumeric、Stringなどのクラスに属しています。

TechAcademyマガジンはオンラインのプログラミングスクールTechAcademy [テックアカデミー]が運営する教育×テクノロジーのWebメディアです。初心者でもすぐ勉強できる記事が2,000以上あります。

Rubyで引数の型チェックをする方法について解説します。

Rubyについてそもそもよく分からないという方は、Rubyとは何なのか解説した記事をまずご覧ください。

 

なお本記事は、TechAcademyのWebアプリケーションオンラインブートキャンプの内容をもとに紹介しています。
 

田島悠介

今回は、Rubyに関する内容だね!

大石ゆかり

どういう内容でしょうか?

田島悠介

Rubyで引数の型チェックをする方法について詳しく説明していくね!

大石ゆかり

お願いします!

 

型チェックをする理由

メソッドには def myFunc(name, year)のように引数を設定できます。

Rubyは動的型付け言語と呼ばれるプログラミング言語のため、引数の型を制限できません。そのため、myFuncの引数nameは文字列(String)、year は整数(Integer)が正しい使い方だとしても、nameに数値、yearに文字列を入力することができてしまいます。

期待とは異なる型のデータを入力すつと、プログラムは正しく動作しないことが多いため、型や値のチェックでより堅牢にしてあげるほうが良いでしょう。
 

型チェックをする方法

型チェックをする方法はいくつかあります。

is_a?(kind_of?)メソッド、instance_of? メソッド、class メソッド、=== メソッド、この4つで型チェックが可能です。

それぞれ簡単に解説します。

– is_a?(kind_of?)メソッドは、自分のクラス、親のクラス、インクルードしているモジュールについてチェックできます。

– instance_of?メソッドは、自分のクラスについてチェックできます。親のクラスや、インクルードしているモジュールを指定した場合はfalseとなります。

– classメソッドは、自分のクラスを返します。期待する型(クラス)と比較することで、型チェックが可能です。

– ===メソッドは、右辺が左辺のインスタンスなら true、そうでなければfalseを返します。is_a?(kind_of?)と同じく、親のクラスやインクルードしているモジュールもチェックできます。
 

[PR] Rubyのプログラミングで挫折しない学習方法を動画で公開中

実際に書いてみよう

数値を2倍にして返す、doubleメソッドの引数nの型チェックをしてみましょう。

 

# 数値を2倍にする
def double(n)
  n * 2
end

 

is_a?(kind_of?)

is_a?メソッドは、自分のクラス、親のクラス、インクルードしているモジュールについてチェックできるメソッドです。

まずは整数かどうかを検証します、Integerと一致するかをチェックします。

 

# 数値を2倍にする
def double(n)
  if n.is_a?(Integer)
    n * 2
  else
    "#{n} は数値ではありません"
  end
end

 

ただし、このままでは小数が入力されると、期待値(2倍した数値)ではなく、”1.0 は数値ではありません”というメッセージが返ってきてしまいます。

Integerは数値を意味するNumericクラスを親に持っていて、小数のクラスFloatも同じようにNumericを親に持ちます。

is_a?メソッドの特性を利用してNumericクラスとの比較を行うことで、小数を含む数値全般かどうかのチェックができます。

 

# 数値を2倍にする
def double(n)
  if n.is_a?(Numeric)
    n * 2
  else
    "#{n} は数値ではありません"
  end
end

 

instance_of?

instance_of?メソッドは、自分のクラスについてのみのチェックとなるため、is_a?のように親のクラスや、インクルードしているモジュールのチェックはできません。
厳密なチェックをしたい場合に利用すると良いでしょう。

 

# 整数を2倍にする
def double_integer(n)
  if n.instance_of?(Integer)
    n * 2
  else
    "#{n} は整数ではありません"
  end
end

 

class

classメソッドは、自分のクラスが返ってくるため、チェックしたいクラスとの比較をすると良いでしょう。

処理としては、instance_of?と同様の結果になります。

 

# 整数を2倍にする
def double_integer(n)
  if n.class == Integer
    n * 2
  else
    "#{n} は整数ではありません"
  end
end

 

===

===メソッドは、処理としては is_a?(kind_of?) と同様の結果になります。

==と似ているので間違えがちですが、必ず左辺がクラス、右辺がチェック対象の変数というふうに順序が決まっています。
特に理由がなければis_a?を使う方が好ましいかと思います。

 

# 数値を2倍にする
def double(n)
  if Numeric === n
    n * 2
  else
    "#{n} は数値ではありません"
  end
end

 

筆者プロフィール

メンター稲員さん

フリーランスエンジニア。
大手SEからフリーランスのWeb系エンジニアにジョブチェンジ。

経験言語:Ruby、Rails、Python、C/C++、Java、Perl、HTML/CSS3、JavaScript、CoffeeScript,Node.js。
おうち大好きマンです。

 

大石ゆかり

内容分かりやすくて良かったです!

田島悠介

ゆかりちゃんも分からないことがあったら質問してね!

大石ゆかり

分かりました。ありがとうございます!

TechAcademyでは初心者でも最短4週間でエンジニアになれるRuby on Railsオンラインブートキャンプを開催しています。

現役エンジニアがパーソナルメンターとして受講生に1人ずつつき、マンツーマンのメンタリングで学習をサポートし、最短4週間でオリジナルWebサービスを開発することが可能です。

また、現役エンジニアから学べる無料のプログラミング体験会も実施しているので、ぜひ参加してみてください。