メソッド
メソッドは、処理をまとめることで、再利用しやすくしたものです。
実は、今までのgetsやeach、mapなどもメソッドです。
メソッドの作成
Rubyでメソッドを作る例を次に示します。
def puts_hello
puts 'Hello'
end
puts_hello
puts_hello()
メソッドの作成にはdef end
を使用します。def
の後ろにはそのメソッドの名前をつけます。ここでは、puts_hello
としました。また名前を書いた後には、改行をしてその後ろに処理を記述します。
メソッドの実行方法(メソッドの実行のことを、メソッドを呼び出すという言い方をすることがあります)は、puts_hello
のようにメソッド名を記述します。メソッド名には、puts_hello()
のように括弧をつけることもできるのですが、今回の場合は括弧がなくても同じように処理されるため、簡潔に書くために括弧はない方がよいです。
引数(ひきすう)
メソッドには引数というものを設定できます。
def puts_string(str)
puts str
end
def puts_string2(str1, str2)
puts str1 + str2
end
puts_string('hello')
puts_string2('hello', 'world')
引数は、名前の後ろに()
を記述して、その中に変数名のように引数の名前を書きます。
引数には、メソッドに入力として渡された値が代入されます。puts_string
でいえば、hello
がputs_string2
は、hello
とworld
がメソッドの引数として渡されます。
メソッドの実行結果を見れば分かるように、引数によって処理の内容が変化していると言うことが分かるはずです。
また、引数は、カンマで区切ることにより複数記述することができます。
実は、出力を行うputs
もメソッドです。上記にメソッドの括弧を省略できるという話がありましたが、putsでは、慣例的に括弧が省略されるため、括弧を書いていませんが、独自に定義したメソッドなのでは、引数がある場合、括弧を記述してそこに引数となる値を設定することが多いです。
デフォルト引数
引数には、デフォルトとなる値を設定できます。こうすることで、引数が大量にあるような場合でも、基本となるような引数を省略して書くことで楽ができます。
def puts_string2(str1, str2 = 'world')
puts str1 + str2
end
puts_string2('hello')
puts_string2('good', 'afternoon')
デフォルト引数では、デフォルト値を引数名=値
として設定します。このようにすると、引数がふたつではなくひとつとしてputs_string2('hello')
のように実行でき、実行時には、str1にはhello、str2にはworldが代入されているのと同じように扱えます。
戻り値
メソッドには、戻り値と呼ばれるものがデフォルトで設定されています。
戻り値は、名前の通りメソッドを実行した際に、メソッドを実行した場所に戻す(返す)値のことです。
具体的な例を次に示します。
def calc_circle_area(radius)
radius * radius * 3.14
# 明示的に戻り値であることを示すためにreturnをつけることもできます
# return radius * radius * 3.14
end
puts calc_circle_area(1)
puts calc_circle_aree(3)
calc_circle_area
では、半径の値を引数として円の面積を求めています。
メソッドにおいて、メソッド内で最後に実行した処理の結果が戻り値となります。そのため、今回のメソッドは、radius * radius * 3.14
が戻り値となります。また、戻り値をputsの引数として使用して、結果を出力しています。
メソッドの戻り値を明示的に示す方法にはreturn
があり、これを書いた後に戻り値となる値を書くことで、その後ろに書かれた処理を切り上げることができます。
def calc_circle_area(radius)
return radius * radius * 3.14
puts '実行されない'
end
このように、returnを記述すると、その後ろの処理は実行されません。
参照渡し
引数として渡した値を、メソッドの中で変更すとどうなるのでしょうか。もしかして呼び出す方の値も変わるかもしれません。実はこれについては、原則変更はありません。
def change_value(val)
val = 1
end
a = 3
change_value(a)
puts a # 3
しかし、場合によっては変更されることがあります。これは破壊的な変更を実施するメソッドを実行したときです。
破壊的な変更をするメソッドはmap!
のように最後に!がついているのが慣例ですので、簡単に見分けがつきます。このようなメソッドを実行するときは、気をつけて実行しましょう。
まとめ
メソッドは複数の処理をまとめて実行できることから、同じ処理をコピペで複数書くよりも効果的に、同じ処理を複数回実行できます。
また、処理がまとめられているため、ソースコード自体の可読性も向上します。
そのため、もう一度実行しそうな処理などはメソッドとして分けておくことを心がけましょう。