Rubyで引数の型チェックをする方法を現役エンジニアが解説【初心者向け】
初心者向けにRubyで引数の型チェックをする方法について現役エンジニアが解説しています。変数や引数が文字列なのか数値なのかデータ型を判別するには、クラスを判定するメソッドを使います。値はIntegerやNumeric、Stringなどのクラスに属しています。
テックアカデミーマガジンは受講者数No.1のプログラミングスクール「テックアカデミー」が運営。初心者向けにプロが解説した記事を公開中。現役エンジニアの方はこちらをご覧ください。 ※ アンケートモニター提供元:GMOリサーチ株式会社 調査期間:2021年8月12日~8月16日 調査対象:2020年8月以降にプログラミングスクールを受講した18~80歳の男女1,000名 調査手法:インターネット調査
Rubyで引数の型チェックをする方法について解説します。
そもそもRubyについてよく分からないという方は、Rubyとは何なのか解説した記事を読むとさらに理解が深まります。
なお本記事は、TechAcademyのオンラインブートキャンプRuby講座の内容をもとに紹介しています。
今回は、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?)と同じく、親のクラスやインクルードしているモジュールもチェックできます。
実際に書いてみよう
数値を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
筆者プロフィール
メンター稲員さん
フリーランスエンジニア。 経験言語:Ruby、Rails、Python、C/C++、Java、Perl、HTML/CSS3、JavaScript、CoffeeScript,Node.js。 |
内容分かりやすくて良かったです!
ゆかりちゃんも分からないことがあったら質問してね!
分かりました。ありがとうございます!
TechAcademyでは、初心者でもRuby on Railsを使ったプログラミングを習得できるオンラインブートキャンプRuby講座を開催しています。
挫折しない学習方法を知れる説明動画や、現役エンジニアとのビデオ通話とチャットサポート、学習用カリキュラムを体験できる無料体験も実施しているので、ぜひ参加してみてください。