
Ruby入門講座へようこそ!プログラミングYoutuberのせお丸です。
この講座は、これからRubyを勉強してみたい!という初心者の方に向けて、
Rubyの全てをわかりやすく解説した入門講座です。
なお、この記事の内容はYoutubeでも公開しています。

記事よりもYoutubeの方が分かりやすいのでオススメです!
フル字幕なので、音を消しても動画学習できます
Rubyについてのご質問は、このYoutubeのコメント欄で受付していますので、わからない所があったら質問してください♪
なお、このYoutubeチャンネルでは「未経験から年収1000万円を目指すプログラマー養成講座」を配信していますので、ぜひチャンネル登録をお願いします♪
それではRuby入門講座スタートです!
Ruby入門 第1章
Rubyとは
Rubyは日本人が作ったプログラミング言語で、世界中で人気があります。
コードの量が少なく初心者でも覚えやすいのが特徴です。
そんなRubyでできることは、主にWEBアプリ制作です。
WEBアプリというのは、Amazonや、ぐるなびのような、インターネット上で使うシステムのことです。
Rubyを勉強していると、RubyOnRailsという言葉がよく登場しますので、
今のうちに、RubyとRubyOnRailsの違いについて解説します。
Rubyというのはプログラミング言語です。
一方でRubyOnRailsというのは、フレームワークです。
フレームワークというのは、開発を便利に進めるための物です。
ですので、まず皆さんが覚えるべきなのは、Rubyになります。
RubyとRubyOnRailsは別物ですので、混同しないようにだけ注意しておきましょう
Ruby入門 第2章
環境構築
それではここからは実際にRubyのコードを書いていきましょう!
そのためにはまず、Rubyのコードを書いて、実行するための環境が必要になります。
そこで今回は、paiza.io というサイトを紹介します。
このサイトは、面倒なインストールなどを一切しなくても、すぐにRubyが実行出来る環境が整っています。
まずはRubyに触れてみたいという方は、このpaiza.ioで良いかと思います。
そして一通りRubyを勉強して、いよいよ本格的に開発を進めるフェーズになったら
自分のパソコン上でRubyが実行できるような環境を作りましょう。
その時に準備するものは2つです。
1つは、コードを書くためのエディタです。
無料でオススメのエディタはVisualStudioCodeというエディタです。
そしてもう1つ、Rubyを自分のPCにインストールする必要があります。
これはMacとwindowsでインストール方法が違うので、
「Mac Ruby環境構築」とか「Windows Ruby環境構築」などでグーグル検索してみてください。
Ruby入門 第3章
文字列とは
「こんにちは」という文字は、Rubyでは文字列と呼びます。
文字列は、このように半角のダブルクォーテーションかシングルクォーテーションで囲みます。
このように、クォーテーションで囲まずに文字を入力した場合は、エラーが発生しますので、必ずクォーテーションで囲むように注意しましょう
コメント
コメントとは、ソースコードの中にメモ書きができる機能です。
コメントの書き方は先頭に半角の#記号をつけるだけです。
こちらの例でいうと、灰色になっている部分がコメントです。
コメント1のように、1行丸々コメントにすることもできますし、
コメント2のように、行の末尾にコメントを入れることもできます。
この灰色になっているコメント部分は、プログラムの実行時には無視されます。
ですので、このコードを実行すると、”こんにちは” と出力されるだけです。
皆さんも、このサンプルのようにコメントを書いて実行してみてください
文字列の連結
文字列は+記号を使って連結することができます。
例えばこのように、“こんにちは” + “Aさん” と書かれたコードを実行すると、
と出力されます。
+記号によって、2つの文字列が、1つの文字列として結合された状態になります。
同じように、“1” + “1”を実行すると、”11″という文字列が出力されます。
「え!1+1は2じゃないの?」と思う方もいるかもしれませんが、
これは数字ではなく、あくまで文字なので、1という文字が2つ連結された結果、”11″という文字列になります。
皆さんもこれを実際に実行してみてください
数値
Rubyでは文字列の他に数値を扱うこともできます。
クォーテーションを付けずに数字をかくと、文字列ではなく数値として扱われます。
では、数値と文字列の違いをみていきましょう!
まずはp 1と書いて実行すると、1と表示されます。
次に p 1 + 1 と書いて実行すると、 2と表示されます。
先ほど文字列で、p "1" + "1"
と書いた場合は、文字が連結されて11と表示されていましたが、
数値で p 1 + 1 と書いた場合は、計算結果の2が表示されます。
このように数値を使うと計算を行うことができます。
色々な計算
数値を使うと、足し算の他にもいろんな計算を行うことができます。
+記号を使うと足し算になりますし、
–記号を使うとひき算になります。
なお、
掛け算の場合は、アスタリスク記号、
わり算の場合は、スラッシュ記号を使います。
記号は全て半角なので注意してください。
数値同士は計算ができる。
Ruby入門 第4章
変数とは
変数とは値を入れておく箱のようなものです。
早速、実際のコードをみながら解説していきます。
変数を使うには、まずはじめに、変数を定義する必要があります。
それをやっているのが、この1行目のコードです。
tmp = "1"
と書いていますが、これはtmpという名前の変数に”1″という値を代入する、という意味になります。
代入とは「tmpという箱の中に値を入れました」という意味です。
そして次の行でp tmp
を実行すると、”1″ が出力されます。
どうしてこうなるかというと、tmpという変数、つまり箱の中には1という値が入っています。
ですので、このコードを実行すると、箱の中身が取り出されて1が出力されるわけです。
このように、値を入れておく箱のことを変数と呼びます。
そして変数を定義するときは「変数名=値」の形式で書きます。
変数(注意点)
変数について、いくつか補足です。
まず、変数に代入する値は文字列でも、数値でも何でもOKです。
注意点としては、変数名はクォーテーションで囲ってはいけません。
これだとエラーになってしまいます。
次に、変数名はどんな名前を付けてもOKです。
例えば、tmpではなく、fooのような別の名前でもOKです。
ただし、変数名に使える文字は、半角英数字とアンダーバー記号のみです。
foo_12のような変数名はOKです。
ただし、先頭に数字を持ってくることはできません。
この場合もエラーになってしまいます。
プログラムは上から順番に実行される
なお、プログラムは上から順番に実行されます。
変数を定義する前に、その変数を使おうとすると、エラーが発生しますので注意しましょう。
変数の応用
変数を使うとこんなことも出来るようになります。
1つ目は数値の計算です。
aという変数に数値の1を代入して、
bという変数には数値の2を代入します。
そして、a + b を実行すると、3という結果が返って来ます。
もう1つは、文字の連結です。
aという変数に”Ruby”という文字列を代入して、
bという変数には”入門”という文字列を代入します。
そして、a + b を実行すると、文字列同士の連結になりますので
という結果が返って来ます。
変数の上書き
なお、変数は上書きすることができます。
例えば上記画像のように書いた場合、
1行目では、変数に”Ruby”という文字列が代入されます。
そして2行目では、変数に”Ruby入門”が代入されることで、上書きが発生します。
その結果、3行目を実行すると、
という文字列が出力されます。
また、数値の場合も同様に上書きすることができます。
数値の場合は、このように「自分自身に1を足し算する」なんてこともできます。
このコードを解説すると、
1行目で、変数 i(アイ) に1が代入されます。
そして2行目で、1+1の計算結果が、変数に代入されます。
その結果、最後の行では2という結果が返って来ます。
なお、この計算の書き方には基本形と省略形があります。
左側が基本形、右側がその省略系の書き方です。
どちらの書き方でも同じ意味になります。
変数は繰り返し使える
変数は繰り返し使うことができます。
つまり、変数から値を取り出しても、値はそのまま残り続けます。
実際のコードをみてみましょう!
まずは1行目で、program という変数に”Ruby”という文字列を代入しています。
そして、次の行を実行すると
と出力されます。
最後の行を実行すると、
と出力されます。
このように、変数の値は何度使っても消えることはないので、
繰り返し使うことができます。
文字列に変数を埋め込む
文字列に変数を埋め込む方法を紹介します。#{変数}
という書き方をすると、文字列の中に変数を埋め込むことができます。
それでは実際のコードをみていきましょう!
1行目で変数i(アイ)に数値を代入しています
2行目で変数x(エックス)に文字列を代入しています
そしてこのように、文字列の中に変数を埋め込みます。
すると、
と出力されます。
このように、
#{変数} という書き方をすると、文字列の中に変数を埋め込むことができます。
これを変数展開といいます。
注意点としては、文字列は必ずダブルクォーテーションで囲む必要があります。
シングルクォーテーションで囲った文字列の場合は変数展開されずに、このような出力となります。
Ruby入門 第5章
比較
Rubyでは、2つの値が等しいかどうかを比較することができます。
比較を行うときは、 == (イコール記号を2つ)使います。
そして、比較結果が正しい場合はtrue、正しくない場合はfalseという結果が返って来ます。
それでは実際のコードをみてみましょう!
1行目のコードでは、左側の1という数字と、右側の1という数字が同かどうかをチェックしています。
この場合、2つの値は同じなのでtrueという結果が返って来ます。
2行目のコードでは、1と2が同じかどうかをチェックしています。
この場合、2つの値は等しくないので、falseという結果が返って来ます。
このように、2つの値が等しいかどうかをチェックするときは、
== (イコール記号を2つ)使います。
イコール記号が1つだけだと代入になってしまうので、間違わないように注意してください。
そして、比較結果が正しい場合はtrue、正しくない場合はfalseが返って来ます。
なお、
この比較式の部分を、プログラミングの世界では条件式と呼びます。
bool型
比較結果の true ・false のことを、プログラミングの世界ではbool型と呼びます。
bool型は比較結果なので必ずtrueかfalseのどちらかになります。
それ以外の結果になることはあり得ません。
なお、bool型は文字列とは別物です。
クォーテーションを付けて”true””false”と書いた場合、これはbool型ではなく文字列です。
一方で、クォーテーションを付けずにtrue false と書いた場合は、bool型としてみなされます。
比較演算子
比較には他にも色んな種類があります。
いずれも、その条件式が正しければtrue、正しくなければfalseが返ってきます。
例えば、a < (小なり) b とかくと、aよりbが大きいかどうか?の比較になります。
正しければtrue、正しくなければfalseが返ってきます。
3行目のコードのように、<(小なり)の後にイコール記号を付け足した条件式の場合は、 a以上かどうか?を判定する条件式になります。
4行目、5行目のように、大なり記号を使った場合は、その逆で、
aよりbが小さいかどうか?を判定する条件式になります。
最後の行は、aとbが異なる場合にtrueを返します。
実際にどんな結果が返ってくるか、皆さんもコードを書きながら色々と試してみてください。
これらの条件式は、どんな結果が返ってくるでしょうか?
1つずつみていきましょう!
まずは1問目ですが、これは1と2が等しいかどうか?の条件式になります。
これは正しくないので、結果はfalseが返ってきます。
次の2問目は、1より2が大きいか?という条件式です。
結果はtrueです。
3問目は、1は1以上か?という条件式です。
結果はtrueです。
最後の4問目は、1は2より大きいか?という条件式です。
結果はfalseです。
if文
if文を使うと、条件式の結果によって処理を分岐させることができます。
if の後に条件式を書きます。
そして次の行に、trueだった場合の処理を書きます。
最後にendと書いてif文を終了します。
それではif文を使った実際のコードをみていきましょう!
このコードは、scoreが80以上だったら、「合格点です」と表示されるプログラムです。
if の後ろの条件式の部分には score80以上 という条件式が設定されています。
そしてこの条件式がtrueだった場合、ifとendに囲われた部分の処理が実行されます。
今回の場合だと、”合格点です”という文字が出力されます。
では、1行目の変数scoreに70を代入したらどうなるでしょうか?
その場合は、条件式がfalseになりますので、if文の中身は実行されません。
つまり、何も表示されません。
処理の流れとしてはこんなイメージになります。
プログラミングは、上から下に向かって順番に処理が行われていきます。
ですので、条件式がtrueの場合は123と表示されます。
条件式がfalseの場合は、if文の中が実行されませんので、1と3だけが表示されます。
if-else文
if文の中にelseという文を入れると、falseの場合の処理も書くことができます。
では実際のコードをみていきましょう!
今度はif文の中にelseという文が含まれています。
すると、条件式がfalseだった場合の処理も書くことができます。
それ以外は先ほどまでの通常のif文と同じです。
if-elsif-else文
elsif文を使うと、さらに条件を増やすことができます。
elsif文とは、ifとelseの間に、さらに条件を追加したい時に使う文です。
今回は、elsif score70以上という条件を追加してみました。
それではこのコードがどういう動きになるのかをみていきましょう!
scoreが80以上の場合は、”合格点です”と表示されます。
scoreが70〜79点の場合は、elsifの条件式がtrueになるので、”惜しい”と表示されます。
scoreがそれ以外、つまり69点以下の場合は、elseになりますので”頑張りましょう”と表示されます。
ifの条件式もelsifの条件式もどちらもtrueになりますが、
elsifの中身は実行されません。
elseifというのはあくまで、上の条件を満たさなければ、次はこちらの条件式も試してね、
という文なので、elsifよりも上の方で、何らかの条件式を満たした場合は、その時点で終了となります。
条件式の組合せ(AND)
条件式はいくつかを組み合わせる事もできます。
条件式を組み合わせるときは、&(アンド記号)を2つ使います。
このようにかくと、全ての条件式がtrueだったらtrue、
それ以外はfalse、という意味になります。
ですので、左側の条件式がtrue、かつ、右側の条件式もtrueだった時に初めてtrueが返ります。
どちらか一方でもfalseだったら、その瞬間にfalseが確定します。
このような、&&記号2つのことを、AND条件と呼びます。
条件式の組合せ(OR)
条件の組合せにはもう1つ、OR条件というものもあります。
コードの書き方は、&記号ではなく、|(パイプ記号)を2つ使うとOR条件になります。
OR条件の場合は複数の式のうち、どれか1つでもtrueだったらtrueを返します。
つまりfalseが返ってくるのは、全ての条件が全滅でfalseだった場合のみです。
条件式の組合せ(OR)
それではここまでのまとめとして、実際にコードを触って遊んでみましょう。
私が書いてみたサンプルはこちらです。
if-elseを使った条件分岐や、AND条件を使った条件の組み合わせなどが使われています。
それとこのコードでは、さらっとif文の中に
またif文を書いたりしています。
このように、if文の中にさらにif文が入っている状態を、プログラミングの世界では
ネストと呼びます。
Ruby入門 第6章
配列
複数の値をまとめたものを配列といいます。
配列を使うときは、このように半角のブラケット記号[]
を使います。
これで中身のない空の配列が出来上がりました。
配列の中には、カンマ区切りで複数の値を入れることができます。
例えばこのように、配列の中に”Ruby”, “PHP”, “Python” とかくと、
この1つの配列の中に、Ruby PHP Pythonという3つの文字列が格納された状態になります。
同様に、数値も配列の中に入れることができます。
なお、値の数に上限などはありませんので、配列には好きなだけ値を入れることができます。
インデクス
配列は、先頭から順番に0から始まる番号が自動的に割り当てされます。
この番号のことをインデクスと呼びます。
このコードの場合、先頭の値は”Ruby”ですので、
ここにインデクス番号0が自動的に割り当てられます。
その次の”PHP”はインデクス1番、Pythonはインデクス2番となります。
次に、配列の値を1つだけ取り出してみましょう!
まず、この配列はarrという名前の変数に代入されています。
そして、配列から値を取り出す時は、このようにインデクス番号を指定します。
arrの0番を指定すると、”Ruby”という文字列が返ってきます。
同様に、
1番を指定するとPHP、
2番を指定するとPython、
という結果が返ってきます。
なお、配列に格納した値のことを要素と呼びます。
配列の要素を取り出す、という表現をすることがありますので、覚えておきましょう!
また、配列から値を取り出しても、配列の中身は変わりません。
つまり、このように配列の要素を取り出しても、
この配列には、この3つの文字列が格納されたままの状態となります。
nil
それでは、arr[9]のように、存在しないインデクス番号を指定した場合はどうなるのでしょうか?
その場合は、nilという値が返ってきます。
nilとは、存在しない状態を表す特別な値です。
他のプログラミング言語ではNULLと呼びますが、Rubyではnilという呼び方をします。
ハッシュ(連想配列)
さて、配列はインデクス番号を指定して要素を取り出す、という解説をしましたが、
インデクス番号って覚えづらいですよね。
配列の何番目に何の値が入っているかなんて、いちいち覚えていられません。
そういう時は、配列ではなくハッシュを使います。
ハッシュは配列と非常によく似ています。
ですがインデクス番号で管理するのではなく、1つ1つの要素に好きな名前をつけることができます。
例えば、ハッシュの場合は上記画像のような書き方をします。
Rubyという値に対して、好きな名前をつけることができ、
今回はkey1という名前をつけました。
同様に、PHPという要素に対しては、key2という名前をつけました。
そして値を取り出す時は、このように、その名前を指定して取り出します。
key1という名前を指定して値を取り出すと、
という文字が返ってきます。
このように、配列ではインデクス番号で管理していましたが、
ハッシュでは、要素1つ1つに好きな名前をつけて、その名前で管理します。
これがハッシュです。
なお、ハッシュで使う名前のことを、キーと呼びます。
配列ではインデクス、
ハッシュではキーを指定して要素を取り出すのです。
それでは、ハッシュの定義方法について解説します。
配列を定義する時は、ブラケット記号を使いましたが、
ハッシュを定義する時は、波かっこを使います。
そして、キー =>(イコール大なり) 値,(カンマ)
これで1つの要素を表しています。
シンボル
ハッシュのキーに名前をつけられるようになったのは有り難いのですが、
文字列って、いちいちクォーテーションで囲わなきゃいけないので面倒ですよね。
そんな時は、文字列の代わりにシンボルというものを使うことができます。
シンボルは文字列を省略した書き方です。
文字列は最初と最後をクォーテーションで囲む必要がありましたが、
シンボルの場合は、最初にコロンを打つだけでOKです。
では実際のコードを見ていきましょう!
先ほどはハッシュのキー名を文字列で指定しましたが、
文字列の代わりにシンボルを使うと上記画像のようになります。
クォーテーションで囲む代わりに先頭にコロンを1つ打つだけで良いので、
若干ではありますが、こちらの方が楽です。
このように、文字列を省略した書き方をRubyではシンボルと呼びます。
文字列の代わりにシンボルを使って良い場所は決まっているので注意が必要です。
例えば、ハッシュのキーとしてなら、文字列でもシンボルでもどちらでも構いません。
ですが、ハッシュの値としては、シンボルは使わないようにしましょう。
どの場面でシンボルを使って良いかは、Rubyを書いていくうちに徐々に慣れていきますので、今のうちは難しく考えなくてもOKです。
シンボル => の省略系
ハッシュのキーを指定する際、
シンボルの書き方はさらに省略することができます。
シンボルのコロンをキーの後ろに持っていくと、=>(イコール大なり)の部分を省略することができます。
こちらがその省略形の書き方です。
通常、コロンはキー名の手前についていましたが、
キーの後ろに持ってくることで、このように省略して書くことができます。
配列やハッシュを使うとこんな事もできます。
まずは、配列の中に配列を入れる事ができます。
これを多次元配列と呼びます。
または、配列の中にハッシュを入れたり、
ハッシュの中に配列を入れる事もできます。
プログラムが複雑になってくると、こういう使い方をする事もあるので、
こういう事もできる、ということだけ覚えておきましょう
配列ループ処理
配列の要素を1つずつ順番に取り出して処理することをループ処理と呼びます。
ループ処理を行う時は、配列.each do |変数名| と書きます。
この変数名の部分は好きな名前を付ければOKです。
そして改行してから最後にendと書きます。
それでは、右側のコードを見ながらもう少し詳しく解説していきます!
まずはarrという変数に配列を代入しています。
そしてarr.each doと書きます。
これによって、配列arrの要素を1つずつ順番に取り出して処理してくださいねという命令になります。
そしてまず始めに、最初の要素である”Ruby”という文字列が取り出されます。
そして、取り出された値は、変数langにセットされます。
そして、左側のコードで「ループ処理」と書かれた部分では、変数langを使って好きな処理を書くことができます。
右のコードでは p lang と書いたので、この変数の中身が出力されます。
その結果、
という文字が出力されます。
次に、endまで行くと、配列の次の要素が変数にセットされます。
ですので、次はPHPという文字が変数langにセットされます。
そしてその状態で、2週目のループ処理を行います。
2週目も同様に、 p langで出力が行われますので、
今度は
という文字が出力されます。
そしてまたendまできたら、配列の次の要素であるPythonという文字が変数langにセットされ、3週目のループ処理が開始します。
その結果、今度は
という文字が出力されます。
そして、次のendにやってきますが、これで配列の要素は全て処理が終わりましたので、
ようやくここでループ処理を抜けて、endの下の行へとプログラムの実行が進んでいきます。
このように、each文を使うことで、配列の要素を1つずつ取り出して処理を行うことができます。
これを、ループ処理と呼びます。
ループの外でこの変数を使おうとしてもエラーになりますので注意しましょう。
ハッシュのループ処理
ハッシュの場合も配列と同じようにeach文を使ってループ処理を行うことができます。
ただ1つ、違いがある点は、変数名が1つではなく、2つになります。
上のコードのように、
1つ目の変数keyには、キーが入ります。
2つ目の変数valには、値が入ります。
これでeach文を実行すると、
まずは、ハッシュの先頭にあるkey1: “Ruby” という1要素が取り出されます。
そして、1つ目の変数にはハッシュのキーがセットされます。
つまり、変数keyに対して、key1が代入されます。
2つ目の変数valには、ハッシュの値がセットされます。
つまり、Rubyという値が変数valにセットされます。
ですので、1周目のループでは、
という文字が出力されます。
次の2周目のループでは、
変数keyにはkey2、
変数valにはPHPという文字が代入されますので、
という文字が出力されます。
next
ループ処理をスキップさせたい場合はnext文を使います。
このコードでは、nextとif文を組み合わせて使っています。
もし、langイコールPHPだったら、nextを実行する、という意味になります。
nextが実行されると、そのループ処理はスキップされて、次のループ処理に進みます。
ですので、このコードを実行すると、lang == PHPの時は処理がスキップされるので、
結果として、RubyとPythonの2行だけが出力されます。
このように、ループをスキップさせたい時はnext文を使います
Ruby入門 第7章
メソッド
処理をまとめたものをメソッド、または日本語で関数と言います。
メソッドは呼び出されるまで実行されません。
それでは実際のコードを見ていきましょう!
このコードでdefからendに囲まれた部分、これが1つのメソッドです。
def というのは、メソッドを作る時に使われるものです。
次に、studyと書かれていますが、これはメソッドの名前です。
メソッドの名前は好きな名前をつけることができます。
次に、(lang)と書かれていますが、これは引数と言います。
引数は、メソッドを呼び出す時に、メソッドの外から代入することのできる変数です。
後ほど、もう少し詳しく解説します。
次に、defとendに囲まれた部分に、2つの処理が書かれています。
このメソッドが呼び出されると、この部分の処理が実行されます。
このようにメソッドは、処理をまとめたものです。
そして、呼び出されるまでは実行されません。
それでは、早速このメソッドを呼び出してみましょう!
まず、このプログラムを実行すると、上から順番に処理が流れてきます。
ですが、メソッドは呼び出されるまで実行されないので、
メソッド部分は処理がスキップされて、study(Ruby)と書かれた行が一番始めに実行されます。
study(Ruby)ではメソッドの呼び出しをしています。
メソッド名studyを書くことで、メソッドの呼び出しになります。
次に、(“Ruby”)と書かれていますが、これは引数に”Ruby”という文字列を渡しています。
つまり、メソッドの変数langに”Ruby”という文字列が代入されます。
そして今、studyメソッドが呼び出されましたので、
メソッドの中身が実行されます。
変数langには、引数としてRubyという文字列が渡されていますので、
今回は、
“Ruby講座”
という2行が出力されて、このメソッドは終了します。
メソッドの処理が終了すると、プログラムの実行は、
メソッドの呼び出し側の方に戻ってきます。
たった今、study(Ruby)行が実行されましたので、
次は study(PHP)行が実行されます。
今度は引数としてPHPという文字列が渡されましたので、
“PHP講座”
という2行が出力されます。
これがメソッドの基本動作です。
メソッドの引数
さて、メソッドの引数についてもう少し補足をします。
def askをみてください。
引数がありません。
このように、引数を受け取る必要のない場合は、引数なしとなります。
ちなみに、このコメントに書いてあるように、空の括弧は必要ありません。
他のプログラミング言語では、引数なしの場合は、こういった空の括弧をつけることが多いのですが、Rubyの場合は、空の括弧は必要ありません。
呼び出し側も、空の括弧はつけずに、このように呼び出します。
次に、say_ageをみてください。
今度は引数が2つあります。このように複数の引数を受け取りたい場合は、カンマで区切って複数の引数を持たせます。
呼び出し側も、say_age(“私”, 30)のようにカンマ区切りで引数を渡します。
引数のデフォルト値
引数にはデフォルト値を持たせることができます。
デフォルト値とは、「何も指定がない場合に採用される値」のことです。
上のコードを解説していきます!
今回は、引数の宣言と同時に、me=”私”のように値を代入しています。
これがこの引数のデフォルト値になります。
それではこのメソッドを呼び出してみましょう!
まずは引数なしでsay_ageを呼び出してみます。
すると、引数の指定がない場合は、デフォルト値が採用されますので、
引数meには、デフォルト値である”私”という文字が採用されます。
同様に、引数ageには、デフォルト値である30という値が採用されます。
その結果、この呼び出しでは、
という結果が返ってきます。
次は、say_age(nil, 20)を呼び出してみましょう!
この場合、第1引数はnil、つまり指定が何もないので、引数meにはデフォルト値である”私”という文字が代入されます。
次に、第2引数には20という数字が渡されていますので、引数ageには20が代入されます。
デフォルト値とは、あくまで指定が何もなかった場合に採用される値ですので、
今回のように、値の指定がある場合には、デフォルト値ではなく、指定された値が採用されます。
その結果、今回は
という結果が返ってきます。
そして最後に、say_age(“君”, 20)のように2つとも引数を指定した場合は、どちらの引数もデフォルト値ではなく、指定した値が採用されますので、
という結果になります。
キーワード引数
Rubyでは、キーワード引数と言って、引数に名前をつける機能があります。
具体的には、say_age(age: 30)のようなコードを書きます。
今回は、引数ageの後ろにコロンがついています。そして30という数字は引数ageのデフォルト値です。
このように書くことで、この引数ageは、キーワード引数となります。
では、キーワード引数を呼び出してみましょう!
呼び出す時には、say_age(age: 20)のように、いちいちキーワードを指定しながら引数を渡す必要があります。
これの何が嬉しいのかというと、引数の意味が見た目でわかりやすくなるというメリットがあります。
一方で、いちいちキーワードを指定する必要があるので、面倒臭いというデメリットもあります。
こんなものがあるんだ、程度に覚えておけば大丈夫です。
可変長引数
Rubyには可変長引数というものがあります。
可変長引数を使うと、1つの引数で複数の値を受け取ることができます。
それではコードをみていきましょう!
引数の前にアスタリスクをつけると可変長引数になります。
これで、複数の値を受け取ることができるようになりました。
それではこのメソッドを呼び出してみましょう!
今回は3つの引数を与えてメソッドを呼び出してみます。
すると、可変長引数は、この3つの値を配列として受け取ります。
オプション引数
それともう1つ、オプション引数というものもあります。
先ほどの可変長引数では、配列で値を受け取りましたが、
こちらのオプション引数は、ハッシュで値を受け取ります。
引数にはアスタリスクを2つつけます。これでオプション引数となり、
複数の値をハッシュで受け取ることが出来るようになりました。
先ほどの可変長引数の時は、アスタリスクが1つでしたが、
今回のオプション引数では、アスタリスクが2つになります。
呼び出し側は、上記コードのようにキーワードつきで引数を渡します。
するとオプション引数は、ハッシュで値を受け取ることができます。
returnと戻り値
メソッドを使うときに重要となる、returnについて解説します。
メソッドの中ではreturn文を使うことができます。
returnの役割は2つです。
1つはreturnが実行されると、その場でメソッドの処理は強制終了となります。
もう1つは、メソッドの呼び出し側に値を返すことができます。
それではコードをみながら説明していきます。
このコードでは、引数のageが20以上だった場合に、
return “大人料金”
という処理が実行されます。
returnが実行されると、その場でメソッドの処理は強制終了となります。
メソッドの中に他の処理が書いてあっても、実行されません。
そしてreturnにはもう1つの役割があります。
それは、呼出元へ戻り値を返す役割です。
戻り値というのは、return の右側に指定された値のことです。
今回の場合は、”大人料金” という文字列が戻り値として、呼出元に返されます。
一方の呼出元では、戻り値をres = price(20)のように受け取ることができます。
priceメソッドを実行した結果、”大人料金”という文字列が戻り値として返されます。
その戻り値をresという変数に代入しています。
その結果、変数resを出力してみると、
と出力されます。
なお、returnの戻り値を何も指定しなかった場合、戻り値はnilとなります。
暗黙的な戻り値
Rubyでは、return文を書かなくても、最後に処理した値を暗黙的に戻り値として返します。
一体どういうことなのか、コードをみながら解説していきます。
まずは一番左のコードをみてください
引数の i に2を足しています。その計算結果の3という数字が、変数 i に代入されます。
そしてその変数 i をreturnで返しているので、戻り値は3になります。
これが基本形となります。
それでは、真ん中のコードをみていきましょう!
今度は、return がありません。
この場合は、戻り値はどうなるのでしょうか?
PHPやJavascriptなど、他のプログラミング言語では、こういう場合は戻り値がNULL、
つまり、何も返ってきません。
ですがRubyの場合は、最後に処理した値を暗黙的に戻り値とする。というルールがあります。
このコードの場合、メソッドの一番最後に、i と書かれています。
これによって、変数 i の中身である3という数字をRubyが認識します。
その結果、最後に処理した値は「3」で、それを暗黙的に戻り値としますので、このメソッドの戻り値は3となります。
この暗黙的な戻り値は、Rubyを初めて経験する方にとってはキモい。と思われるかもしれませんが、慣れましょう。
この真ん中のコードをさらに省略したのが一番右のコードです。
i + 2 の計算結果は3になります。
つまり、Rubyが最後に処理した値は3です。
これがそのまま戻り値として返されるので、結果は3になります。
つまり、上の3つのコードは全て同じ意味のコードです。
演習問題
それでは皆さんに問題です。
先ほど使ったこのコードですが、わざわざreturnを書かなくても、
暗黙的な戻り値を使って、もっとシンプルに書くことができます。
では、どんなコードを書けば良いでしょうか?
ポイントとしては、引数ageが20以上だったら、”大人料金”という戻り値を返します。
それ以外はnilを返します。
正解は、こちらのコードです。
まず、引数ageが20以上の場合、if文の中に入りますので、
Rubyは”大人料金”という文字列を認識します。
そしてそのままメソッドが終了しますので、最後に認識した”大人料金”という文字列が戻り値となります。したがって、2つのコードは同じ結果になります。
一方、引数ageが20未満の場合はどうなるでしょうか?
その場合はif文の中に入らないので、何も処理されないままメソッドが終了します。
何も処理されない、ということはnilが戻り値となりますので、
この場合も2つのコードは同じ結果になります。
このように、暗黙的な戻り値に慣れてくると、コードをシンプルに書けるようになります。
ちなみに、さらにシンプルに、
このような書き方をすることもできます。
Rubyではif文を1行で書くこともできるのです。
行の末尾にif文を書くと、条件式がtrueの場合のみ、この行を実行する、
という動きになります
Ruby入門 第8章
unless
Rubyにはif文と逆の動きをするunless文というものがあります。
こちらのコードをご覧ください。
if文は、条件式がtrueなら処理を実行しますが、
unless文はその逆で、条件式がfalseなら処理が実行されます。
unless文はこのように1行で書くこともできます。
1行で書く時は行の末尾にunless文を書きます。
条件式がfalseなら、その行が実行されます。
このコードの、i は変数です。
.instance_of?(Integer)は、
変数i が整数だったらtrue、整数でなければfalseを返すメソッドです。
つまり、このコードは、変数i が整数でなければfalseとなり、
unlessはfalseの時に処理を実行しますから、結果的に、
と出力されます。
例外
コードの途中で想定外のことが起きた場合は、自分でエラーを発生させることができます。
この想定外エラーのことを例外、または英語でExceptionと呼びます。
それでは実際のコードをみていきましょう!
このcalc_tax(i)メソッドは、引数で数値を受け取ることを想定しています。
ですので、文字列など、数値以外のものが引数に渡されるのは想定外です。
こういう時は、引数が数値かどうか?をチェックして、
数値でなければ想定外エラーを発生させましょう。
引数が数値であるか?をチェックするためには、i.instance_of?(Integer)のようにコードを書きます。
そして数値でない場合は、想定外エラー、つまり例外を発生させましょう。
Rubyで例外を発生させるには、fail文 を使って、引数にはエラーメッセージを指定します。
fail(“エラーメッセージ”) i.instance_of?(Integer)
これで「数値でなければ例外が発生する」というコードになりました。
例外が発生するとどうなるかというと、その時点で処理はエラー終了となります。
どちらを使っても全く同じ動きになりますが、今の段階では、raiseではなくfailを使う、と覚えましょう。
例外をキャッチする
例外が発生するとその場でエラー終了になる、と解説しましたが、
書き方によっては、処理を継続させることもできます。
まずはこのコードのように、
# ブロック1
rescue
# ブロック2
end
を使います。
beginとrescueの間には、例外が発生するかもしれない処理を書きます。
そしてこのbeginの中で例外が発生した場合は、その場で全ての処理を中断して、rescueの中へと飛ばされます。
これがどういうことなのか、上記画像のコードをもう少し詳しくみていきましょう!
まずはbeginの中で、p calc_tax(“あ”)が実行されます。
引数で文字列を渡しているので、メソッドの中で例外が発生します。
例外が発生すると、その場でrescueの中へと飛ばされます。
ですので、メソッドの中の残りの処理は当然実行されませんし、
beginの中の、残りの処理も実行されません。
例外が発生した時点で、ただちにrescueへと飛ばされます。
例えるならば、悪いことをした時点で逮捕されて、警察署に連れて行かれるようなものです。
このように、例外を捕まえることを、例外をキャッチするといいます。
そして、キャッチされた例外は自動的にrescut => eの、変数eに代入されます。
変数eの使い道としては、
e.message とかくと、エラーメッセージを表示することができます。
今回の場合は、fail()の引数に指定した、
というエラーメッセージが表示されます。
そして、e.backtraceで、どのコードの何行目でエラーが発生したか?が表示されます。
最後に、rescueの処理が全て終了すると、end の外に処理が進みます。
ですので、endの外に書いてあるp calc_tax(2)は実行されます。
例外を再び投げる
キャッチした例外を再び発生させることができます。
例えば、
rescueの中でエラーメッセージをみたりして、エラーの原因調査をしたい。
だけども、endの外の残りの処理は実行したくない、
そういう時は、キャッチした例外をrescueの外へ投げることによって、処理を中断させることができます。
キャッチした例外をrescueの外へ投げたい時は、raise eと書きます。
Rubyのコーディングルールとしては、
failは例外を発生させる時に使い、
raiseはキャッチした例外を再び投げる時に使うのが好ましい、とされています。
ensure
例外が発生しても、しなくても、いずれにせよ必ず実行したい処理がある場合は、
ensureを使います。
このコードのように、rescueの下に、ensure を追加することで、
例外が発生してもしなくても、ensureの中が必ず実行されます。
処理される順番としては、はじめにbeginの中が実行され、例外が発生しなかった場合は、rescureはスキップされて、ensureの中が実行されます。
もし例外が発生した場合は、rescueの中が実行されてから、最後にensureが実行されます。
特定エラーのキャッチ
さて今度は、割り算を行うdivメソッドを用意しました。
1 / iのように割り算を行っています。
Rubyでは、0で割り算をしようとすると、ZeroDivisionErrorというエラーが発生します。
エラーには、このように、いろいろな種類があります。
それではコードをご覧ください。
今回は、rescue ZeroDivisionErrorというコードが追加されています。
このように書くことで、特定エラーを指名してキャッチすることができます。
ZeroDivisionErrorエラーが発生した場合は、
と表示されます。
そしてこの場合は、通常のrescureの中身は実行されません。
一方で、数値以外を指定した場合は、failで例外が発生するので、
rescue ZeroDivisionError の中身は実行されません。
通常のrescueの中身が実行されます。
メソッド全体の例外をキャッチ
Rubyでは、このようにかくとメソッド全体の例外をキャッチすることができます。
この書き方の場合、beginは使わずに、rescueだけを使います。
Ruby入門 第9章
クラス
クラスというものを使って、変数やメソッドをひとつにまとめることができます。
今回は、クラスを使って、猫を作ってみましょう!
クラスを作る時は、class Catのように定義します。
クラスの名前は大文字で始まるようにします。
そしてendと書いてクラスの終わりの位置を定義します。
end
クラスの中には、変数やメソッドをまとめておくことができます。
まずはinitializeというメソッドを追加して、この猫の名前や体重を引数で受け取ります。
そしてこの引数を、@つきの変数に代入します。
このように変数に@をつけると、クラスの中のどこからでも参照できるようになります。
例えば、eatメソッドをみてください。
このメソッドは、猫が食事をすると、体重が1kg増える、というプログラムです。
ここでは体重を表わす変数として、@weight という変数を使っていますが、
これは、initializeメソッドで定義したこの@weightを参照しています。
そして、eatメソッドでは、体重が1kg増えるというプログラムで、
@つきの変数に変更を加えています。
このように値が変更された場合は、次回参照される時には変更後の値となります。
ですので、例えばcryというまた別のメソッドから@weightを参照しようとすると、
変更後の@weightの値となります。
このような@つきの変数のことを、属性、またはメンバ変数と呼びます。
さて、このコードでは、Catクラスで、猫とはこういう生き物だよ、と定義しました。
それでは、これから猫を呼び出してみましょう。
猫を呼び出すには、クラス名に続けてnewと書きます。
newは、initializeメソッドを呼び出します。
newと、initializeでメソッド名が違うじゃん!とツッコミたくなりますが、
ここはこういうものだと割り切って覚えてください。
ですので、newの引数に渡した、”一郎”という名前が、この猫の名前として@nameに代入されます。
同様に、5という数字が、この猫の体重として、@weightに代入されます。
これで一匹の猫がこの世に生まれました。この一郎という名前の猫はcat1という変数に入れておきます。
そしてもう一匹、二郎という名前の猫も呼び出してみます。二郎は一郎よりも痩せているので、体重は3Kgです。
これで、cat1、cat2の2匹の猫が生まれました!
それでは、猫に魚を食べさせてみましょう!
猫にエサをあげる時はeatメソッドを使います。
eatメソッドを使うと、猫の体重が1kg増えます。
それではcat1に魚を食べさせてみます。cat1の初期体重は5Kgでしたので、エサを食べて体重が1Kg増えた結果、体重は6Kgになりました。
次に、cat2にもエサを食べさせてみます。cat2は初期体重が3Kgでしたので、エサを食べて体重が1Kg増えた結果、体重は4Kgになりました。
次に、もう一度cat1にエサを食べさせてみます。cat1は先ほど体重が6Kgでしたので、さらにエサをあげると、今度は7Kgになります。
一郎がエサを食べたからといって、二郎が太ることはありません。
逆に、二郎がエサを食べたからといって、一郎が太ることもありません。
あくまで、別々の歴史・別々の人生を歩んでいるのです。
このように、クラスを別々にnewする、ということは
新しい猫が生まれて、1つの歴史が始まることを意味します。
ですので、クラスの属性は、クラスの中で使い回しになる、という話をしましたが、
cat1とcat2はお互いに別々の歴史となります。
cat1がエサを食べたからといってcat2が太ることはありません。
このように、クラスをnewすると、1つの歴史が始まります。
この1つの歴史のことをインスタンスと呼びます。
インスタンスとは、クラスをnewしたものです。
cat1で1つのインスタンス、cat2もまた1つの別インスタンスです。
コンストラクタ
クラスを初期化するメソッドのことをプログラミングの世界ではコンストラクタと呼びます。
Rubyではinitializeメソッドがコンストラクタです。
initialize()は無くてもOK
initializeは省略することもできます。
ただし、このままではクラスの外から属性を設定することができません。
attr_accessor
attr_accessorを使うと、クラスの中と外、両方から自由に属性の読み書きをすることができます。
attr_accessorはクラスの中で上記コードのように設定します。
attr_accessorと宣言した後に、属性の名前をシンボルで記述します。
カンマで区切ることで、複数の属性を設定できます。
これで@つきのnameとweight属性を暗黙的に宣言したことになり、
さらにクラスの外からでも読み書きできるようになりました。
それではこのクラスを外から呼び出してみましょう!
まずはインスタンスを作ります。
そしてこのように、name属性をクラスの外から上書きすることができます。
属性の参照も、クラスの外から行うことができます。
ただし、クラスの外から自由に書き込みができるのは、プログラムの設計上、あまり良いことではないので、initializeメソッドを使って属性をセットする方がおすすめです。
定数
変わることのない値を定数といいます。
定数は、大文字とアンダーバーで名前を書きます。
クラスの中から参照する時は、上記コードのように参照します。
変数と一緒です。
定数はクラスの外からも参照することができます。
クラスの外から定数を参照する時は、クラス名の後にコロンを二つつけてから定数名を書きます。これで、クラスの外から定数を参照することができます。
Staticメソッド
属性を使わないメソッドは、どのインスタンスから実行しても同じ結果になります。
例えば、このコードのnameメソッドをみてください。
これは@name属性を出力する処理なので、インスタンスによって結果が変わります。
nameが一郎だったら、”私の名前は一郎”という結果になりますし、
nameが二郎だったら、”私の名前は二郎”という結果になります。
ですが、cryメソッドをみてください。
こちらは引数でfoodを受け取って、「foodが好きだニャン!」と結果を返すだけなので、
属性を使っていません。
属性を使わないということは、どのインスタンスで実行しても同じ結果になります。
これは言い換えると、わざわざインスタンスを作る必要がない、とも言えます。
このように、状態を持たないメソッドをstaticメソッドといいます。
staticメソッドを定義する時は、メソッド名の手前に、self.を付け足します。
これでstaticメソッドの出来上がりです。
staticメソッドはインスタンスを作らずに呼び出すことができます。
使い方は、クラス名.メソッド名と書くだけです。
staticの一括定義
複数のstaticメソッドを一括で定義することもできます。
その場合は、classの中に、class << self と書いて、終わりをendで締め括ります。
この中に定義したメソッドは全てstaticメソッドになります。
この場合は、個々のメソッド名の手前に、self.を付け足す必要はありません。
継承
さて、ここにCatクラスとDogクラスがあります。
Catクラスは猫を呼び出すクラスで、
Dogクラスは犬を呼び出すクラスです。
この2つのクラスの違いは、cryメソッドで、ニャン!と鳴くか、ワン!と鳴くかの違いだけです。
こういう時は、共通しているコードを1箇所にまとめましょう!
まずはAnimalクラスを作って、共通しているコードをここにまとめます。
そして、CatクラスとDogクラスのクラス名の隣に、< Animal と書きます。
これはどういう意味かというと、Animalクラスの機能を引き継いだまま、別のクラスを定義します、という意味になります。
つまり、CatクラスもDogクラスも、Animalクラスの機能は全て使えるので、先ほどのコードと、
こちらのコードは全く同じ意味になります。
このように、別クラスの機能を引き継ぐことを、クラスの継承と呼びます。
継承を使うと、共通しているコードを1箇所にまとめることができるので便利です。
また、継承もとのAnimalクラスを親クラスと呼び、
機能を引き継いだ側のCatクラスやDogクラスのことを子クラスと呼びます。
さらに、継承は何段階でも行うことができます。
例えば、Catクラスを継承した孫クラスを作ることも可能です。
オーバーライド
継承を使うと親クラスの機能を引き継ぐ、ということがわかりましたが、
引き継いだ機能は、子クラス側で上書きすることができます。
例えば、Animalクラスで定義されているeatメソッドは、エサを食べるごとに体重が1kgずつ増えていきます。
では、Catクラスにもeatメソッドを追加して、体重が2Kgずつ増えるように書き換えてみましょう!
これで、親クラスにも子クラスにも同じメソッドが存在しています。
この場合、親クラス側のメソッドは無視されて、子クラス側のメソッドが実行されます。
つまり、メソッドは上書きすることができるのです。
この上書きのことを、プログラミングの世界ではオーバーライドと呼びます。
オーバーライドをしても、親クラスには影響を与えません。
ですので、Dogクラスのeatメソッドを実行すると、Animalクラスのeatメソッドが実行されるので、体重の増加は1Kgのままです。
module
今度は、class Animalという動物クラスと、class Humanという人間クラスを考えてみましょう!
どちらも食べる、という機能を持っているので、eatメソッドを持たせたいです。
ですが、人間と動物は親子関係にはならないので、Animalクラスを継承してHumanクラスを作るのは不自然です。
こういう時はmoduleというものを使います。
moduleは、クラスの一部分だけを切り取って部品化したものです。
それでは実際のコードをみていきましょう!
まずはmodule Eatを定義します。
classの定義とほぼ一緒で、classの代わりにmoduleと宣言するだけです。
これでmoduleという1つの部品が出来上がりました。
今回は、moduleの中に1つしかメソッドを持たせていませんが、メソッドを2つ以上持たせても構いません。
そして、AnimalクラスとHumanクラスでは、このmoduleをinclude文で読み込みます。
これで、moduleの持つ機能、つまりeatメソッドが使えるようになりました。
なお、今回はEat moduleを1つだけincludeしましたが、複数のmoduleをincludeすることもできます。
最後に

以上、Ruby入門講座でした!
Rubyの他にも、Youtubeでプログラミング情報を配信しているので、ぜひ他の動画も覗いてみてください♪
コメント