メソッドは何度も同じ処理をする場合に、それをまとめることによって何度も同じ処理をしなくていいように、処理をまとめたものになります。
メソッドの作り方
以下の例のようにメソッドを作成し、呼び出すことが可能です。
「def」の後にメソッド名を記載し、その下にインデントをつけてメソッドで行いたい処理を記載し、「end」で閉じます。
#メソッドの定義
def hello
puts 'Hello^^'
end
#呼び出しはメソッド名を記載するだけ
hello
#実行結果
Hello^^
プログラミングは上から実行されるため、メソッドを定義する前に呼び出すとエラーになります。
以下の場合はエラーになります。
#定義より先に呼び出し
hello
#メソッドの定義
def hello
puts 'Hello^^'
end
#実行結果
NameError: undefined local variable or method `hello' for main:Object
引数のあるメソッド
引数とは「パラメーター」とも言われ、メソッド内で使用する数値を渡す変数になります。
「括弧()」を使った場合
「括弧()」を使った場合は、必ず引数を渡さなくてはいけません。
メソッドの引数ですが「括弧()」で記載し、括弧内に仮引数名を記載します。
以下の例ではnameで仮引数を設定し、呼び出し時に「nabelog」を渡して実行しています。
#メソッドの定義
def hello(name)
puts "Hello^^, #{name}!"
end
#呼び出し
hello('nabelog')
#実行結果
Hello^^, nabelog!
デフォルト値の設定
デフォルト値を設定することで、引数の指定を省略しても実行することができます。
「括弧()」内で仮引数に値を代入することで、デフォルト値を設定することができます。
def hello(name = 'Unknown')
puts "Hello^^, #{name}!"
end
#引数なしでの呼び出し
hello
#実行結果
Hello^^, Unknown!
#引数ありでの呼び出し
hello('nabelog')
#実行結果
Hello^^, nabelog!
仮引数を指定して値を渡すキーワード引数
以下のように仮引数名を記載して、呼び出すこともできます。
def hello(name: 'Unknown')
puts "Hello^^, #{name}!"
end
#呼び出し
hello(name: 'nabelog')
真偽値のフラグを渡す場合(true,falseを渡すだけでは何の処理をしているか分かりづらい)や複数の引数がある場合はこちらの書き方が可読性が上がるので、こちらで記載しましょう。
以下はメソッド呼び出しのキーワードの並びを変えても正常に動作している例です。
def hello(name: 'Unknown', show: false)
puts "Hello^^, #{name}!" if show
end
#呼び出し
hello(name: 'nabelog', show: true)
-> Hello^^, nabelog!
#キーワードの順番を変えて、呼び出し
hello(show: true, name: 'nabelog')
-> Hello^^, nabelog!
戻り値
Rubyでは最後に計算された結果が戻り値として自動的に返却されるため、明示的に戻り値を指定する必要はありません。
以下の例では自動的に戻り値が設定されるsum1メソッドと、明示的に戻り値を指定しているsum2メソッドを記載しています。
まず以下の例を見てください、「return」を記載しているわけではありませんが、「val1 + val2」が計算されて「4」が出力されています。
def sum(val1, val2)
val1 + val2
end
puts sum(1, 3)
-> 4
次の例では明示的に「return」と記載して、「val1 + val2」を返却しています。その後に「val1 * val2」の掛け算を記載しています。
実行すると「4」が返ってくるので、「return」で記載されているものが優先されていることが分かります。
def sum2(val1, val2)
return val1 + val2
val1 * val2
end
puts sum2(1, 3)
-> 4
可変長引数
以下のように引数の先頭に「*」をつけて「*values」のように記載することで、複数の変数をArray形式で渡すことができます。
injectメソッドはArrayのメソッドで各値を足した結果を取得するために使用しています。
def sum(*values)
values.inject { |total, n| total + n }
end
puts sum(1, 2, 3, 4)
-> 10
また、「*」アスタリスク一つの場合はArrayで値を受け取りますが、「**」アスタリスク二つの場合はHashで値を受け取ります。
def hash_method(**ky_vals)
puts ky_vals
end
hash_method(val1: :a, val2: :b)
-> {:val1=>:a, :val2=>:b}
まとめ
以上のようにメソッドの作成方法から色々な仮引数の設定方法を解説しました。
仮引数が多くなるとバグが発生する原因ともなりますので、必須の仮引数、オプションの仮引数、可変長仮引数は意識して設定するようにしてください。
コメント