今回は、プログラミング言語Rubyにおける、メソッド(関数)の使い方について説明します。プログラミングにおける関数とは、「複数の処理を1つにまとめて、扱いやすくした部品」という意味を持ちます。
なお、Rubyでは「関数」ではなく、オブジェクトに属する「メソッド」と呼びます。トップレベルに定義されたメソッドは、どこからでも呼べるのでほかの言語の「関数」とほぼ同じ意味として使われます。
メソッドの種類
一般的にプログラミング言語には、そのプログラミング言語に標準で組み込まれている関数「組み込み関数」と、ユーザーが自分で定義する「ユーザー定義関数」の2種類があります。
Rubyの場合は、「組み込み関数」を「(カーネル)メソッド」と呼び、「ユーザー定義関数」は単に「メソッド」と呼ばれることが多いです。
ここではユーザーによる「メソッド」定義(他のプログラミング言語の「ユーザー定義関数」にあたる)のやり方を説明します。
メソッド定義の方法(引数なし)
Rubyのメソッド定義は、「def」と「end」の間に、実行したい処理を挟みます。
一般的な書き方は、次のようになります。
1 2 3 |
def メソッドの名前 やりたい処理 end |
たとえば、「Hello World!」と表示するhelloメソッドは、次のように書きます。
1 2 3 |
def hello puts "Hello World!" end |
メソッドの呼び出し
定義したメソッドはメソッド名を書くだけで呼び出して処理を実行することができます。
1 2 3 4 5 |
def hello puts "Hello World!" end hello #=> Hello World! |
メソッド定義の方法(引数つき)
メソッドに対して、何らかの値を渡したい場合は、引数を付けます。引数付きのメソッド定義は、以下の書式を使います。
1 2 3 |
def メソッドの名前(引数1、引数2…) 処理 end |
前項のメソッドを引数付きで書き直すと、次のようになります。
1 2 3 |
def hello(name, age) puts "Hello World! #{name}! You are #{age} years old!" end |
#{変数}は「式展開」と呼ばれる書式で、文字列の中に変数などを埋め込む書き方です。
上記のプログラムでは、1〜3行目でメソッドを定義、その中で「name」と「age 」という2つの引数を用意しています。そしてメソッドの中の #{name}と #{age}でそれぞれを呼び出して、できた文章をputsで出力しています。
引数つきメソッドの呼び出し
引数なしの時は、メソッドの名前を書くだけでしたが、引数付きの時は、変数の後に()を付けて、その中に値を指定します。以下のようにします。
1 |
hello([nameに渡す値], [ageに渡す値]) |
例えば、次のようになります。
1 2 |
hello("tomochan", 43) Hello World! tomochan! You are 43 years old! |
helloというメソッドを呼びだし、nameという変数に"tomochan"を、ageという変数に43という数字を渡しています。
その結果、以下のように表示されます。
1 |
Hello World! tomochan! You are 43 years old! |
デフォルト値付き引数
なお、引数には、デフォルト値を設定しておくことができます。
1 2 3 |
def hello(name="tomochan", age=43) puts "Hello World! #{name}! You are #{age} years old!" end |
デフォルト値を指定すると、そのメソッドを呼び出す時に、引数指定を省略できます。すべての引数についてデフォルト値が指定されている場合、メソッド名の後の()も省略できます。
上記の場合、引数なしでhelloメソッドを呼び出すと、デフォルト値のname="tomochan"とage=43が使われています。
引数の順番を間違えると
ただ、ここまでに説明したやり方には欠点があります。引数の順番を間違えると、予期しない結果が起きてしまうのです。
1 2 |
hello(43,"tomochan") Hello World! 43! You are tomochan years old! |
そのため、複数の引数を渡す場合は、次項の、キーワード引数による方法をオススメします。
メソッド定義の方法(キーワード引数)※Ruby2.0以降
メソッド定義のところで、変数でなくてキーワードを指定する方法があります。Ruby2.0以降でしか使えませんが、非常に扱いやすいので、Ruby2.0以降では、基本的に以下の手法を用いる方がよいでしょう。
1 2 3 |
def hello(name:, age:) puts "Hello World! #{name}, #{age} years old." end |
キーワード引数つきメソッドの呼び出し
呼び出しは以下のようにします。
1 2 |
hello(name: "tomochan", age: 43) Hello World! tomochan, 43 years old. |
キーワード引数のデフォルト値
キーワード引数にも、デフォルト値を設定できます。デフォルト値が設定されているキーワード引数は、メソッド呼び出しの際、省略できます。
1 2 3 |
def hello(name: "tomochan", age: 43) puts "Hello World! #{name}, #{age} years old." end |
上記helloメソッドでは、nameとageの両方に、デフォルト値が設定されています。そのため、呼び出すとき、単にhelloと書くと、そのデフォルト値が使われます。
メソッドの返り値:return
上記の例では、メソッド内で処理した内容を表示していましたが、メソッドで処理したデータを戻して欲しい時があります。
そのような場合は、returnを使って返り値を指定します。
例えば、渡された数値を2倍にして返して欲しいという場合は、以下のようになります。
1 2 3 4 5 6 7 8 9 10 |
def multiple(num) return num * 2 end #変数numberを定義 number = 3 #変数numberをmultipleメソッドで2倍にして戻す number = multiple(number) puts number #=>6 |
returnの後には、オブジェクトや式を書きます。return文が実行されるとその時点でメソッドの処理は終了します。
メソッドを使う時の注意点
メソッドの名前の決まり
ただし、メソッドの名前のつけ方には決まりがあります。この決まりに従ってつけないと、エラーになります。
1 2 |
1. 1文字目は英文字かアンダーバー(_) 2. 2文字目以降は英数文字かアンダーバー |
メソッド定義を書く順番
メソッドを書くのは、メソッドを呼び出す「前」でなければなりません。逆だとエラーになります。
1 2 3 4 5 6 7 |
hello def hello puts "Hello World!" end #=> NameError: undefined local variable or method `hello' for main:Object |
まとめ
- Rubyのメソッド定義はメソッド名()
- ()の中に「キーワード:」を指定すると、メソッド名(キーワード:)で値を渡せる
- ()の中に「キーワード:デフォルト値」を指定すると、デフォルト値も指定できる