すでにメンバーの場合は

無料会員登録

GitHubアカウントで登録 Pikawakaが許可なくTwitterやFacebookに投稿することはありません。

登録がまだの方はこちらから

Pikawakaにログイン

GitHubアカウントでログイン Pikawakaが許可なくTwitterやFacebookに投稿することはありません。

Rails

【Rails】 8.Rubyのメソッドを学ぼう

※ カリキュラムでは、Cloud9のターミナルやエディタを利用します。
まだ用意していない方は「AWS Cloud9を準備しよう」を参考に導入してください。

メソッドとは

メソッドとは、オブジェクトを操作する処理を1つにまとめて名前を付けたものです。

例えば、「名前を言う」と「趣味を言う」という2つの処理は、図のようにintroduceという名前を付けて1つにまとめることができます。

メソッドとは

他のプログラミング言語では、処理をまとめて名前を付ける機能を「関数」※1 と呼びます。「メソッド」と「関数」は、ほとんど同じ機能ですが、概念が違います。

Rubyでは、全てがオブジェクトであり、操作の対象もオブジェクトになります。そのため、オブジェクトを操作するという意味合いが含まれた「メソッド」と呼びます。

メソッドを活用できるようになると、同じコードを何度も記述する必要がなくなるよ!

ぴかわかさん
ポイント
  1. 関数は、複数の処理を1つにまとめて名前を付けたもの
  2. メソッドは、オブジェクトを操作する処理を1つにまとめて名前を付けたもの
  3. オブジェクトは、Rubyで扱うことができる全てのデータ(値)のこと

メソッドの定義と呼び出し

メソッドの定義について学ぼう

以下のようにメソッドを定義します。

メソッドの定義
1
2
3
def メソッド名
  # メソッドを呼び出した時に実行したい処理
end

キーワードのdefのあとに「メソッド名」を指定します。
その後のendまでの間に、メソッドを呼び出した時に実行したい処理を指定します。

メソッドを定義してみよう

それでは、irbを起動して「introduceメソッド」を定義してみましょう。

irb | introduceメソッドを定義する
1
2
3
4
def introduce
  p "私の名前は、ぴっかちゃんです。"
  p "私の趣味は、サウナです。"
end

動画のようにirbは1行だけではなく、複数行に渡るコードも実行することができます。

1行入力したら「Enterキー」か「returnキー」を押しましょう。
続けて、次の行のコードを入力してください。

メソッドを定義する

最後のendを入力して「Enterキー」か「returnキー」を押すと、「introduceメソッド」を定義したという=> :introduceが表示されます。

これでメソッドを定義することができましたが、メソッドは定義しただけでは使うことができません。メソッドを使うには、「メソッドの呼び出し」が必要です。

ポイント
  1. メソッドを作ることを「メソッドを定義する」という
  2. メソッドの定義は、キーワードのdefを使う
  3. キーワードのendまでの間に実行したい処理を指定する

メソッドの呼び出しについて学ぼう

メソッドを呼び出す(メソッドを実行させる)には、操作の対象となるオブジェクトとメソッド名をドッド.で繋ぎます。

メソッドの呼び出し
1
オブジェクト.メソッド名
irb | lengthメソッドで文字列オブジェクトの文字数を返す
1
2
"Hello World".length
#=> 11

しかし先ほど定義した「introduceメソッド」は、オブジェクトを省略してメソッド名だけで呼び出すことができます。

サンプルコード
1
2
3
4
5
6
def introduce
  p "私の名前は、ぴっかちゃんです。"
  p "私の趣味は、サウナです。"
end

introduce #メソッド名だけでメソッドを呼び出すことができる

動画のようにirbでintroduceと打ち込み、メソッドを呼び出してみましょう。

メソッド名でメソッド呼び出しができる

「introduceメソッド」はトップレベル(Top Level)という場所で定義したので、メソッド呼び出しの際にオブジェクトを省略することができます。

トップレベルの場所は、以下のように自分で定義するクラスの外側を指します。
※クラスの使い方については、次の章で学びます。

トップレベルの場所を確認する
1
2
3
4
5
6
# ここがトップレベル
class
# ここはトップレベルではない
end

# ここがトップレベル

冒頭では「メソッドはオブジェクトを操作する処理を1つにまとめて名前を付けたもの」と学びましたね。

今回は、メソッド呼び出しの際にオブジェクトを省略しているので、オブジェクトを操作しているようには見えませんが、Rubyの裏側ではオブジェクトを操作しているのです。

ぴっかちゃん

うーん。なんだか難しいなぁ。。。

現段階でRubyの全ての仕組みを理解することは難しいので、「メソッドはオブジェクトが必ず関わる」とだけ覚えておこう!

ぴかわかさん
ポイント
  1. メソッドを実行させることを「メソッドを呼び出す」という
  2. メソッドを呼び出すには、オブジェクト.メソッド名を指定する
  3. トップレベルに定義したメソッドは、メソッド名だけで呼び出すことができる

トップレベルにメソッドを定義して呼び出してみよう!

ここからは、Rubyのファイルを使います。
method.rbという名前のファイルを「pikawakaフォルダ」の直下に作成しましょう。

以下のソースコードを「method.rb」に書きましょう。

method.rb | show_profileメソッドを定義する
1
2
3
4
def show_profile
  p "ニックネーム:ぴかわかさん"
  p "趣味:掃除"
end

show_profileメソッドは、ぴかわかさんのプロフィールを表示するメソッドです。

rubyコマンドで「method.rb」を実行してみましょう。
ファイルを実行しても、動画のようにターミナルには何も出力されません。

メソッド定義だけではメソッドは実行されない

「method.rb」にshow_profileメソッドを定義しましたが、メソッドは定義しただけでは使うことができないと学びましたよね。

メソッドを使うには「メソッドの呼び出し」が必要です。

トップレベルに定義したメソッドは、メソッド名だけで呼び出すことができます。「method.rb」に以下のハイライト箇所を追加しましょう。

method.rb | メソッド呼び出しを追加する
1
2
3
4
5
6
def show_profile
  p "ニックネーム:ぴかわかさん"
  p "趣味:掃除"
end

show_profile

再びrubyコマンドで「method.rb」を実行すると、動画のようにターミナルにぴかわかさんのプロフィールが表示されます。

ぴかわかさんのプロフィールが表示される

ソースコードが読まれる順番を確認しよう

method.rbのソースコードを確認してみます。

メソッドは、以下のようにメソッドを作る部分である「メソッドの定義」とそのメソッドを実行させる「メソッド呼び出し」に分けられます。

メソッド定義と呼び出し部分

ソースコードは、以下のように上から順番に読み込まれます。
最初にメソッドの定義部分が読み込まれますが、メソッドは実行されません。

「メソッド呼び出し」が読み込まれたら、show_profileメソッドの処理が実行されます。

ソースコード読み込みの順番

ぴっかちゃん

メソッドを定義している部分が読み込まれても、メソッドは実行されないんだね!

メソッドを実行させるのは「メソッド呼び出し」の部分になるよ

ぴかわかさん
ポイント
  1. ソースコードは上から順番に読み込まれる
  2. メソッドの定義部分だけでは、メソッドにまとめた処理は実行されない
  3. メソッドを実行させるには、メソッド呼び出しが必要になる

メソッドを使うメリットとは

メソッドを使うメリットは、主に以下の通りです。

  • 同じコードを何度も書く必要がなくなる
  • 保守性が向上する

同じコードを何度も書く必要がなくなる

例えば、以下のように重複しているコードがあるとします。

サンプルコード
1
2
3
4
5
6
7
8
p "私の名前は、ぴっかちゃんです。"
p "私の趣味は、サウナです。"

p "私の名前は、ぴっかちゃんです。"
p "私の趣味は、サウナです。"

p "私の名前は、ぴっかちゃんです。"
p "私の趣味は、サウナです。"

同じコードを何度も書くのは、プログラミングする上で非効率になります。さらに長いコードで重複している場合は、読みづらくなります。

メソッドを定義しておけば、処理を書くのは一度だけで済みます。
あとは必要に応じて、メソッドを呼び出すだけです。

サンプルコード | メソッドを使う場合
1
2
3
4
5
6
7
8
def introduce
  p "私の名前は、ぴっかちゃんです。"
  p "私の趣味は、サウナです。"
end

introduce
introduce
introduce
ぴっかちゃん

他にも処理をまとめているから、コードが読みやすくなるね!

保守性が向上する

メソッドを使うと、あとから修正が発生した場合の対応が簡単になります。

例えば、以下のソースコードで「サウナ」を「ランニング」に修正しなければいけなくなったとします。その際に3箇所の修正が必要です。

サンプルコード
1
2
3
4
5
6
7
8
p "私の名前は、ぴっかちゃんです。"
p "私の趣味は、サウナです。" #この行を修正

p "私の名前は、ぴっかちゃんです。"
p "私の趣味は、サウナです。" #この行を修正

p "私の名前は、ぴっかちゃんです。"
p "私の趣味は、サウナです。" #この行を修正

メソッドを使う場合は、以下のように定義部分の1箇所だけの修正で済みます。

サンプルコード | メソッドを使う場合
1
2
3
4
def introduce
  p "私の名前は、ぴっかちゃんです。"
  p "私の趣味は、サウナです。" #この行の修正だけで済む
end

例として挙げたサンプルコードは、コード量が少なかったので3箇所をすぐに見つけることができますが、コードの量が増えるほど修正箇所を見つけることは難しくなります。

メソッドを使うことで、保守性を高く保つことができます。

メソッドの戻り値(返り値)

メソッドには、戻り値(または返り値)と呼ばれるものがあります。
初学者の方がメソッドを学習するとき、「戻り値」を理解することが難しいという声も少なくありません。

メソッドの戻り値を理解するには、用語やメソッドの動作の流れをしっかりと押さえておく必要があります。本題の「戻り値とは」へ入る前に、これらを整理していきます。

メソッド呼び出し元・メソッド呼び出し先とは

まずは、用語の確認をしてみましょう。

メソッド呼び出しの部分は「メソッド呼び出し元」、呼び出されたメソッドを定義する部分は「メソッド呼び出し先」と表現されます。

メソッドの呼び出し元と呼び出し先

「メソッド呼び出し先」と「メソッド呼び出し元」は、どの部分を指しているのかをしっかり押さえておこう!

ぴかわかさん

メソッドの動作の流れを確認しよう

次にメソッドの動作の流れを確認してみましょう。

以下のサンプルコードで説明します。
ソースコードが読み込まれる順番やメソッドの実行されるタイミングなどは「ソースコードが読まれる順番を確認しよう」で前述しているので省略させて頂きます。

サンプルコード

1.先頭行からメソッド呼び出しまでの処理

先頭行から順番に実行を始めて、6行目でshow_profileメソッドが呼び出されます。

メソッドが呼び出されると、先頭から順番に実行していた処理は一時的に中断されるので、7行目には移りません。処理の位置は、メソッドの先頭に移ります。

メソッド呼び出し

2.メソッド本体の処理

続いて、show_profileメソッドの本体である2行目、3行目が順番に実行されます。このときpメソッドによって、ターミナルに文字列が出力されます。

メソッドの本体が実行される

3.メソッドの最終行から呼び出し元まで

メソッドの最終行である3行目を実行し終えると、以下のように「メソッド呼び出し元」の6行目に処理の位置が戻ります。

メソッド呼び出し元に戻る

ぴっかちゃん

処理の位置が「メソッド呼び出し元に戻る」ところがポイント!

4.中断していた処理の続きが開始される

処理の位置が「メソッド呼び出し元」に戻ってきたら、続きが実行されます。
以下のように7行目に移り、8行目が実行されます。

続きを実行する

このようにメソッドの動作の流れを確認すると、メソッド呼び出しによって処理の位置が移ることが分かりますね。

まとめ

メソッド呼び出しによって、処理の位置が以下のように移ります。

処理の位置

メソッド本体の実行を終えると、「処理の位置がメソッド呼び出し元に戻る」ことを覚えておこう!

ぴかわかさん
ポイント
  1. 基本的には、先頭から順番に処理される
  2. メソッドを呼び出すと、処理の位置がメソッドの先頭に移る
  3. メソッド本体の最終行を実行し終えたら、メソッドを呼び出した「メソッド呼び出し元」に処理の位置が戻る

戻り値とは

メソッドの動作の流れでは、メソッド本体の実行が終わると処理の位置が「メソッド呼び出し元」に戻ることを学びましたね。

実はこのとき処理の位置が戻るだけではなく、値も渡しているんです。

以下のように「メソッド呼び出し元」に処理の位置が戻る際には、値が渡されます。この値のことを「戻り値(または返り値)」と呼びます。

戻り値

Rubyのメソッドは、必ず「戻り値」があります。

それでは、メソッド呼び出し元に対して渡される「戻り値」は、どんな値なのでしょうか。次はRubyにおける戻り値について学んでいきます。

ぴっかちゃん

メソッド本体の実行が終わると処理は「メソッド呼び出し元」に戻るだけではなく、何かしらの値を渡しているんだね!

Rubyの戻り値

Rubyでは、定義したメソッドの中で最後に評価された式がメソッドの戻り値になります。

評価とは、式を実行して値を得ることです。
例えば、irbで1 + 1を実行すると2という数値が得られます。

式の評価

つまり「評価された式」とは、式(1 + 1)を実行して2を得たことを意味します。

以下のようにshow_profileメソッドの最終行に1 + 1を追加した場合は、1 + 1が最後に評価される式となります。

最後に評価される式
1
2
3
4
5
def show_profile
  p "ニックネーム:ぴかわかさん"
  p "趣味:掃除"
1 + 1
end

メソッドの戻り値は、「定義したメソッドの中で最後に評価された式」でしたね。

「評価された式」とは、式(1 + 1)を実行して2を得たことなので、「メソッド呼び出し元」に対して渡す戻り値は、数値の2です。

戻り値

それでは、元のコードで考えてみましょう。
以下の場合は、最後に評価される式はp "趣味:掃除"です。

最後に評価される式
1
2
3
4
def show_profile
  p "ニックネーム:ぴかわかさん"
p "趣味:掃除"
end

以下の画像のようにirbでp "趣味:掃除"を実行すると、文字列である"趣味:掃除"を得られることがわかりますね。

式を実行

メソッドの戻り値は「定義したメソッドの中で最後に評価された式」なので、以下の画像のようにshow_profileメソッドの戻り値は、文字列である"趣味:掃除"です。

戻り値2

ポイント
  1. Rubyでは、最後に評価された式がメソッドの戻り値である
  2. 評価とは、式を実行し値を得ること
  3. 最後の式を実行して得た値が「メソッド呼び出し元」に渡される戻り値になる

戻り値の活用方法とは

メソッド本体の処理が終わると「メソッド呼び出し元」に処理が戻ること、「戻り値」が渡されることを学びましたが、メソッドの戻り値はどのように活用されるのでしょうか。

戻り値はメソッドの処理結果として、変数に代入して活用されることが多いです。

2つの数値を足す「addメソッド」を使って説明します。

method.rb
1
2
3
4
5
6
7
8
9
def add
  num1 = 3
  num2 = 5
  num1 + num2
end

sum = add

p "合計は、#{sum}です。"

method.rbに上記のコードを書きましょう。
6行目のshow_profileメソッドの呼び出しは、コメントアウトしておきましょう。

method.rbのソースコード

以下の動画のようにrubyコマンドでmethod.rbを実行してみましょう。

method.rbを実行する

ターミナルには、"合計は、8です。"と出力されますね。

Rubyの戻り値」で学んだように「addメソッド」を呼び出すと、num1 + num2を実行して得た8が戻り値として「メソッド呼び出し元」に渡されます。

戻り値3

そして、以下のように「メソッド呼び出し元」のaddには戻り値が渡されているので、変数sumには8が代入されます。

戻り値を変数に代入する

このようにメソッドの戻り値は、変数に代入して活用されます。

ポイント
  1. 戻り値とは、メソッド呼び出し元に処理の位置が戻る際に渡される値のこと
  2. Rubyでは、メソッド内で最後に評価された式がメソッドの戻り値となる
  3. 戻り値は、変数に代入して活用されることが多い

return

キーワードのreturnを使うと、戻り値を指定し、任意の位置でメソッド呼び出し元に処理を戻すことができます。

例えば、以下のsampleメソッドの戻り値は3 + 3の評価結果である6となります。

サンプルコード | returnを使わない場合
1
2
3
4
5
6
7
8
9
10
def sample
  1 + 1
  2 + 2
3 + 3 #最後に評価される式
end return_value = sample # 6が渡される p "戻り値は、#{return_value}です。"
#=> "戻り値は、6です。"

Rubyでは、定義したメソッドの最後に評価された式が戻り値になるので、上記のような結果となります。

しかし、キーワードのreturnを使うと、途中で処理をメソッド呼び出し元に戻し、returnで指定した戻り値を渡すことができます。

サンプルコード | returnを使う場合
1
2
3
4
5
6
7
8
9
10
def sample
  1 + 1
return 2 + 2 #この行でメソッドの処理を終了させ、4を戻り値として渡す
3 + 3 end return_value = sample # 4が渡される p "戻り値は、#{return_value}です。"
#=> "戻り値は、4です。"

上記では、returnで指定した2 + 2の評価結果である4が戻り値となります。

メソッドの実行はreturnの行で終了するので、次の3 + 3は実行されずに「メソッド呼び出し元」に処理が戻ります。

引数について学ぼう

これまでの学習では、メソッドの本体の処理が終了する際に「メソッド呼び出し元」に対して渡す値である「戻り値」があると学びましたね。

実は最初のメソッド呼び出しの際にも、メソッド本体の処理で利用できる値(あるいは変数)を渡すことができます。この値(変数)のことを引数と呼びます。

引数

「戻り値」はメソッドの実行結果としての値でしたが、「引数」はメソッド本体の処理に利用できる処理です。

引数の使い方

引数を使うには、以下のようにメソッド名の後に括弧で引数を囲います。

引数を使う場合の書き方
1
2
3
4
5
def メソッド名(引数)
  #処理
end

メソッド名(引数) #メソッド呼び出し

実引数と仮引数

引数には「実引数」と「仮引数」があります。

実引数とは、以下のように「メソッド呼び出しの際にメソッドに引き渡される値(あるいは変数)」のことです。

実引数

仮引数とは、以下のように「メソッド呼び出し元から渡される実引数の値を受け取るための変数」のことです。

仮引数

以下のサンプルコードの「実引数」は5、「仮引数」は変数のnumになります。

サンプルコード
1
2
3
4
5
6
7
def double(num) # 仮引数は変数num
num * 2 end
sum = double(5) # 実引数は5
p "5の2倍は#{sum}です。"

実引数には、以下のように変数を指定することもできます。

実引数に変数を指定する
1
2
3
4
5
6
7
8
def double(num)
  num * 2
end

num = 5
sum = double(num) #実引数に5が代入された変数numを指定する
p "#{num}の2倍は#{sum}です。"

上記のコードでは、実引数と仮引数が同じ名前(num)にしていますが、以下のように異なる名前でも問題ありません。

実引数と仮引数は異なる名前でもよい
1
2
3
4
5
6
7
8
def double(num) #仮引数はnum
num * 2 end int = 5
sum = double(int) #実引数はint
p "#{int}の2倍は#{sum}です。"

ただし、メソッド内で引数として渡された値を使うためには、仮引数と同じ名前である必要があるので注意してください。

仮引数と同じ名前である必要がある
1
2
3
4
5
6
def double(num)
num * 2 #numでなければ、値を参照できない
end int = 5 sum = double(int)

こちらの注意点も踏まえて、次に手を動かしながら引数を使ってみます。

ポイント
  1. 実引数とは、メソッド呼び出しの際にメソッドに引き渡される値のこと
  2. 仮引数とは、実引数の値を受け取るための変数のこと

引数を使ってみよう

method.rbでは、数値同士を足す「addメソッド」を定義しています。

引数がなくてもメソッドを使うことができていますが、このままでは「addメソッド」は3 + 5の処理を行うだけのメソッドになります。

method.rb
1
2
3
4
5
6
7
8
9
def add
  num1 = 3
  num2 = 5
  num1 + num2
end

sum = add

p "合計は、#{sum}です。"

他の数値同士で足したい場合は、新しくメソッドを作らなければいけません。

そこで「addメソッド」を再利用するために引数を使います。
上記のコードを以下に書き換えてみましょう。

method.rb | 引数を使うコードに書き換える
1
2
3
4
5
6
7
8
9
def add(num1, num2)
  num1 + num2
end

num1 = 3
num2 = 5
sum = add(num1, num2)

p "合計は、#{sum}です。"

引数は、カンマ(,)で区切ることで複数指定することができます。
上記に書き換えたことで、任意の数値を足すaddメソッドを作ることができました。

動画のようにrubyコマンドでmethod.rbを実行してみましょう。
ターミナルに"合計は、8です。"と出力されます。

引数を使う場合

もう少し再利用できることが分かるように、以下の動画のようにirbで試してみましょう。
addメソッドを定義し、メソッド呼び出しの際に指定する実引数を変更してみてください。

再利用性のあるメソッド

addメソッドを呼び出す際に渡す値を変えることができるので、再利用性が高まりますね。

ポイント

メソッドの引数を使うことで「再利用性」が高まる

変数のスコープ

変数のスコープとは、その変数が使える範囲のことです。メソッド内で定義した変数は、メソッド外で使うことができません。

以下のサンプルコードのようにsampleメソッド内で定義した変数numは、メソッド外で使おうとするとエラーが発生します。

サンプルコード
1
2
3
4
5
6
def sample
  num = 1 #メソッド内で定義した変数
end

p num #メソッド外で使えない
#=>NameError (undefined local variable or method `num' for main:Object)

メソッドの内外で値のやり取りを行う場合は、これまで学習してきた「戻り値」や「引数」を利用します。

メソッド内から外側に値を返すのは「戻り値」を利用します。またメソッド外からメソッド内に値を渡すのは「引数」を利用します。

メソッドの命名規則

最後にメソッド名の決まりや慣習を学びましょう。

メソッド名には、英数字やアンダースコア_!?を使うことができます。
基本的には、先頭は英小文字で始まります。

メソッド名の先頭は英小文字
1
2
3
4
def introduce
  p "私の名前は、ぴっかちゃんです。"
  p "私の趣味は、サウナです。"
end

メソッド名を複数単語で表す場合は、変数と同様にスネークケース(単語の間をアンダースコア_で繋いで書き表したもの)にします。

メソッド名を複数単語で表す場合
1
2
3
4
def show_profile
  p "ニックネーム:ぴかわかさん"
  p "趣味:掃除"
end

他にもメソッド名は動詞の名称にすることで、どんな操作をするメソッドなのか分かりやすくなります。この点は、次のクラスを学ぶとより理解することができます。

この記事のまとめ

  • メソッドとは、オブジェクトを操作する処理を1つにまとめて名前を付けたもの
  • メソッドを使うことで「再利用性」や「保守性」が向上する
  • メソッドは引数や戻り値を利用することで、メソッドの内外で値をやり取りできる

0

わかった!