そもそも関数(メソッド)って何?
Rubyで関数(メソッド)はどうやって書けばいいの?
プログラミングを学んでいると「関数」という言葉をよく聞くと思いますが、このようにそもそも関数が何かわからなったり、どうやって書けばいいのかわからない方も多いのではないでしょうか?
そこで今回はRubyの関数について、基礎からわかりやすく説明していきたいと思います。
関数(メソッド)とは?
関数とは「特定の処理をまとめた塊」のことでメソッドとも呼ばれています。
まずはこちらのサンプルコードをみてください。
def num_times(number) new_number = number + 2 new_number = new_number * 5 new_number end
これはnumberという変数に2を足して5倍するという処理をまとめたもので、このような処理を関数と呼びます。rubyではdef(define=定義する)を使うと関数(メソッド)を定義することができます。
基本構造は以下の通りです。
def 関数の名前(関数の引数1、関数の引数2、…) 処理1 処理2 … end
上記のサンプルコードの例では関数の名前がnum_timesで、関数の引数がnumberですね。そして、new_number = number+2やnew_number*5などは処理にあたります。
このように、関数(メソッド)はとてもシンプルな構造をしています。
またRubyでは関数という言葉は使用せずメソッドという言葉が使用されることがほとんどです。今後の説明ではメソッドという言葉を使用して説明します。
defの使い方についてはこちらの記事で詳しく紹介されているので、参考にしてみてください。
そんなメソッドのメリットは一体なんでしょうか?詳しく見ていきましょう
p 1*2 p 2*2 p 3*2 p 4*2 # => 2 4 6 8
上のコードは1 ~ 4それぞれの数字を2倍にして出力しています。今は2倍ですが、これを3倍にしたいと思った場合、
p 1*3 p 2*3 p 3*3 p 4*3 # => 3 6 9 12
のように全ての数字を変更しなければいけません。今は4個ですが今後大きいプログラムを書いていくと重複箇所が10個や20個になることもあります。
しかし、この2倍にするという処理をメソッドにまとめておけば、どれだけ重複箇所が増えようと変更箇所は一つですみます。
def num_times(number) number * 2 #ここの数字を変更すれば倍率を一括で変えることができる。 end p num_times(1) p num_times(2) p num_times(3) p num_times(4)
上のようによく使用される処理をまとめてメソッドにすることで、変更があった場合にとても対応がしやすくなります。
Rubyでのメソッドの使い方
それではRubyでのメソッドの使い方について解説していきます。
基本のメソッド
メソッドはdefを使って以下のように定義するごとができるのでしたね。
def メソッドの名前(メソッドの引数1、メソッドの引数2、…) 処理1 処理2 … end
例えばdogというメソッドを定義したい場合は
def dog "Woof!" end
このようになります。
ただメソッドは定義するだけだと、実行はされません。メソッド名をコード中に書くことによって、メソッドを実行することができます。
def dog "Woof!" end p dog
"Woof!"
これでメソッドの定義と呼び出しを行うことができます。
引数のあるメソッド
引数とはメソッドに値を飛ばしたい時に使用する数のことです。実際の例で考えてみましょう。上のdogというメソッドに誰が吠えたか飛ばせるようにしてみましょう。
def dog(name) "#{name}はわんと吠えました" end p dog("ポチ") p dog("たま")
"ポチはわんと吠えました" "たまはわんと吠えました"
このように色々な名前でdogという関数を使い回すことができます。またメソッドに設定できる引数には様々なバリエーションがあります。
たとえば可変長引数を使えば、任意の個数の引数を受け取ることができます。
def pets(*pets) p "私のペットは" pets.each {|pet| p pet} p "です" end pets("cat","dog","pig","mantis")
"私のペットは" "cat" "dog" "pig" "mantis" "です"
*アスタリスクをつけて引数を設定することで、任意の個数引数を受け取れる可変長引数になります。
可変長引数は配列として受け取れるので、たとえばeachメソッドを使って展開できます。(eachメソッドを使うことで配列の要素をそれぞれ出力できます。)
そのほかにも、便利な引数がたくさんあるので、引数をより使いこなしたい方はこちらの記事を参考にしてみてください。
また配列についてはこちらを参考にしてください。
メソッドの型
Rubyではメソッドに渡す引数に型を明示する必要がありません。というのも、Rubyは渡された引数によって型を自動的に判別するからです。
dog(name) "#{name}はわんと吠えました" end p dog("ポチ") p dog("たま")
この例ではメソッドdogに対しての引数nameには型が明示されていません。ですが、”ポチ”や”たま”はStringオブジェクトとして渡されています。
渡された引数によって型を判別することができるので、メソッド内でもちゃんとStringオブジェクトとして使用できます。
戻り値について
全てのメソッドに戻り値というものがあります。戻り値とは「メソッドを実行した結果」のことです。
def dog "Woof!" end
で考えてみるとdogメソッドの返り値は”Woof!”ということになります。戻り値とは基本的に、一番最後に実行された行になります。
ですが、returnを使うと、メソッド中の任意のタイミングで戻り値を返すこともできます。
def hotspring(num) return print "#{num}は禁止された番号です" if num == 4 or num == 13 print "あなたは#{num}番を使用します" end hotspring(4) hotspring(13) hotspring(2)
"4は禁止された番号です。" "13は禁止された番号です。" "あなたは2番を使用します。"
この場合、引数として渡されたnumが4と13のときにはreturnで設定された戻り値になります。
まとめ
今回はRubyのメソッドについて解説していきました。メソッドは少し難しいように感じるかもしれませんが使いこなすと、プログラムを綺麗に書くことができます。