Rubyに限らずプログラミング言語では、ある程度コードが長くなってくると、処理の単位ごとにメソッドを作成してコードを分離します。
この記事では、Rubyでメソッドを作成する方法や、作成したメソッドを呼び出す方法について解説していきます。
長くなりすぎたコードをメソッドに分離して、可読性の高いコードを目指しましょう。
「def」でメソッドを作成
Rubyでは、次の構文のようにdef〜endキーワード内に処理を記述してメソッドを定義します。
def メソッド名(引数, ...)
#ここに処理を記述
end
定義したメソッドを呼び出すときは、メソッド名と括弧内に引数を指定して呼び出します。
メソッド名(引数, ...)
メソッド定義のサンプルコード
引数あり・なしなど、実際にサンプルコードを確認しながら、メソッドの定義方法を見ていきましょう。
引数なしのメソッドの例
def say
puts "Hello Ruby"
end
#メソッドの呼び出し
say
【実行結果】
-------------------------------------
"Hello Ruby"
引数が1つのメソッド
def say(args1)
puts "Hello Ruby (args1=%s)" % args1
end
#メソッドの呼び出し
say("引数")
【実行結果】
-------------------------------------
"Hello Ruby (args1=引数)"
引数が2つのメソッド
def say(args1, args2)
puts "Hello Ruby (args1=%s, args2=%s)" % [args1, args2]
end
#メソッドの呼び出し
say("引数1", "引数2")
【実行結果】
-------------------------------------
"Hello Ruby (args1=引数1, args2=引数2)"
戻り値があるメソッド
メソッドで処理した結果を、戻り値として返す場合もあるでしょう。
JavaやC言語などでは、メソッドの宣言時にpublic int say() {…}のように、戻り値の型を指定する必要がありますが、Rubyでは戻り値の型をメソッドで宣言する必要がありません。
処理の中で、return 値のように戻り値を返す処理を書くだけで、戻り値があるメソッドになります。
def sample_return(x1, x2)
#2つの引数を加算した結果を戻り値で返却
return x1 + x2
end
#メソッドの戻り値を変数=resultに格納
result = sample_return(1, 2)
puts "result=" + result.to_s
【実行結果】
-------------------------------------
"result=3"
デフォルト値を指定した引数
メソッドを定義するとき、引数にデフォルト値を指定できます。
デフォルト値を指定しておくと、該当の引数を省略してメソッドが呼び出された場合、デフォルト値が引数の値に設定されます。
デフォルト値を指定した引数のメソッドは、次のように宣言します。
#引数「age」にデフォルト値を指定したメソッド宣言
def sample_method(name, age=30)
puts "Name=%s, Age=%d" % [name, age]
end
#引数「age」を省略してメソッドを呼び出し
sample_method("Yamada")
#引数を指定してメソッドを呼び出し
sample_method("Yamada", 50)
【実行結果】
-------------------------------------
Name=Yamada, Age=30
Name=Yamada, Age=50
このように、引数を省略してメソッドを呼び出した場合はデフォルトが使用され、引数を指定した場合は、指定した値が使用されていることが分かります。
デフォルト値の指定がない引数は、引数を省略してメソッドを呼び出すことはできません。
前述のサンプルコードを、引数を指定せずsample_methodのように呼び出すと、次のようなエラーが発生します。
wrong number of arguments (given 0, expected 1..2) (ArgumentError)
可変長引数 (*args)
メソッドの引数の前に*をつけると、可変長引数となります。
可変長引数は、メソッドの引数残りをすべて配列で受け取ることができる引数で、メソッドに1つだけ宣言できます。
次のコードをご覧ください。
def sample_method(p1, *p2)
puts "p2:%s" % p2.inspect
end
sample_method(1, "A") #可変長引数に1つ値を指定
sample_method(1, "A", "B", "C") #可変長引数に3つ値を指定
sample_method(1) #可変長引数の指定なし
【実行結果】
-------------------------------------
p2:["A", "B"]
p2:["A", "B", "C"]
p2:[]
このように、2つ目以降の引数で指定された値を、可変長引数は配列で受け取ることができます。
キーワード引数
Ruby 2.0以降で使用できる「キーワード引数」は、引数をキーワード: デフォルト値のように宣言できます。
キーワード引数の宣言や、呼び出し時の引数の渡し方は次のとおりです。
def sample_method(name: "Yamada", age: 20)
puts "Name=%s, Age=%d" % [name, age]
end
#メソッドの呼び出し
sample_method(name:"ITO", age:50)
sample_method(name:"ITO") #引数ageを省略
【実行結果】
-------------------------------------
Name=ITO, Age=50
Name=ITO, Age=20
このように、メソッドの呼び出し側もキーワード: 値の形式で引数を指定するため、どの名前の引数にどの値が渡っているかが一目で分かります。
通常の引数とキーワード引数の併用
通常の引数と、キーワード引数を1つのメソッドに同時に宣言することも可能です。
キーワード引数が最後になるようにメソッドを定義しないとエラーになるため、次のコードのように、通常の引数→キーワード引数の順に引数を定義します。
#先頭2つは通常の引数、以降はキーワード引数のメソッド
def sample_method(args1, args2, name: "Yamada", age: 20)
puts "Name=%s, Age=%d" % [name, age]
end
ハッシュで引数を受け取る
キーワード引数はRuby 2.0以降でしか使えないため、それ以前のバージョンで、キーと値で引数を受ける場合は「ハッシュ引数」を使います。
ハッシュ引数は、引数の前に**を付けて宣言します。
def sample_method(**hash)
puts hash
end
ハッシュ引数は、Ruby 2.0以降でも使用できますが、メソッドの宣言を見ただけで、どんなキーワードの引数があるか分かりづらいため、基本的にはキーワード引数を使用したほうがよいでしょう。
まとめ
Rubyの「def」キーワードを使って、メソッドを作成する方法を紹介してきました。
実際のシステム開発でも、メソッドやクラスなどを複数作成して1つのシステムを完成させることが普通であるため、メソッドの作成方法や、キーワード引数、可変長引数などについて理解しておくようにしましょう。
引数がないメソッドを呼び出す場合、括弧の指定は省略できます。