メソッド

メソッドは、処理をまとめることで、再利用しやすくしたものです。

実は、今までの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でいえば、helloputs_string2は、helloworldがメソッドの引数として渡されます。

メソッドの実行結果を見れば分かるように、引数によって処理の内容が変化していると言うことが分かるはずです。

また、引数は、カンマで区切ることにより複数記述することができます。

実は、出力を行う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!のように最後に!がついているのが慣例ですので、簡単に見分けがつきます。このようなメソッドを実行するときは、気をつけて実行しましょう。

まとめ

メソッドは複数の処理をまとめて実行できることから、同じ処理をコピペで複数書くよりも効果的に、同じ処理を複数回実行できます。

また、処理がまとめられているため、ソースコード自体の可読性も向上します。

そのため、もう一度実行しそうな処理などはメソッドとして分けておくことを心がけましょう。